1

我正在尝试创建一个由 20 个字符串组成的数组,其中最多 17 个字符是从名为“words.dat”的文件中获取的。之后,程序应截断仅显示前 17 个字符的字符串,并完全忽略该字符串的其余部分。然而

我的问题是:我不太确定如何完成此任务,谁能给我一些有关如何完成此任务的见解?

这是我当前的代码:

    #include <stdio.h> 
    #include <stdlib.h>

    #define WORDS 20
    #define LENGTH 18

    char  function1(char[WORDS][LENGTH]);

int main( void )
{

    char word_array [WORDS] [LENGTH]; 

    function1(word_array);

    return ( 0 ) ;

}

char function1(char word_array[WORDS][LENGTH])
{
    FILE *wordsfile = fopen("words.dat", "r");
    int i = 0;

    if (wordsfile == NULL)
        printf("\nwords.dat was not properly opened.\n");
    else
    {
        for (i = 0; i < WORDS; i++)
        {
            fscanf(wordsfile, "%17s", word_array[i]);
            printf ("%s \n", word_array[i]);
        }
        fclose(wordsfile);
    }
    return (word_array[WORDS][LENGTH]);
}

words.dat 文件:

Ninja
 DragonsFury
  failninja
   dragonsrage
    leagueoflegendssurfgthyjnu
     white
      black
       red
        green
         yellow
          green
           leagueoflegendssughjkuj
            dragonsfury
             Sword
              sodas
               tiger
                snakes
                 Swords
                  Snakes
                   sage

样本输出:

blahblah@fang:~>a.out
Ninja 
DragonsFury 
failninja 
dragonsrage 
leagueoflegendssu 
rfgthyjnu 
white 
black 
red 
green 
yellow 
green 
leagueoflegendssu 
ghjkuj 
dragonsfury 
Sword 
sodas 
tiger 
snakes 
Swords 
blahblah@fang:~>

该程序之后将完成的工作是:

在 function1 正常工作后,我将创建第二个函数名称“function2”,它将在整个数组中查找匹配“完全”匹配的单词对,包括 case 。之后,我将创建第三个函数,该函数显示我之前创建的 words.dat 文件中的 20 个字符串和匹配的单词。

4

2 回答 2

2

在你的循环改变

fscanf(wordsfile, "%17s", word_array[i]);

fscanf(wordsfile, "% 17s%*[^\n]\n", word_array[i]);

它的基本作用是:

  1. %17s,这很明显,最多读取 17 个字符并将其放入您的 word_array
  2. %*[^\n], 这会读取所有不是 \n 的字符并删除它们 ( *)
  3. \n读取换行符

我通过在您的代码中替换这一行来测试它并且工作正常。

正如其他人所提到的,看看从你的调用返回值到function1. 它基本上word_array[20][18]是数组限制的两倍。它是 的第 21 个元素的第 19 个字符word_array。而你一个都没有。如果它没有返回任何值,这个函数将以同样的方式工作。

于 2013-11-11T21:51:27.597 回答
1

有几点需要注意。首先,我建议您function1返回读取了多少单词的计数,而不是返回word_array[WORDS][LENGTH]您无法访问的内存位置的字符。因此,更改函数以返回int

int function1(char word_array[WORDS][LENGTH])

要处理文件可能包含少于WORDS单词的可能性,您需要知道何时fscanf失败,以及何时退出循环。

if( 1 != fscanf(wordsfile, "%17s", word_array[i]) ) break;

要忽略超过 17 个字符的剩余单词,您可以一次读取一个,直到遇到空白字符或EOF.

int c;
do { c = fgetc(wordsFile); } while( c != EOF && !isspace(c) );

把它们放在一起:

int function1(char word_array[WORDS][LENGTH])
{
    FILE *wordsfile = fopen("words.dat", "r");
    int c, i = 0;

    if (wordsfile == NULL)
    {
        printf("\nwords.dat was not properly opened.\n");
    }
    else
    {
        for (i = 0; i < WORDS; i++)
        {
            if( 1 != fscanf(wordsfile, "%17s", word_array[i]) ) break;

            /* eat remaining characters of long words */
            do { c = fgetc(wordsFile); } while( c != EOF && !isspace(c) );
        }
        fclose(wordsfile);
    }

    /* Return the number of words read */
    return i;
}
于 2013-11-11T21:52:55.783 回答