我试图创建一个20个字符串的数组,最多有17个字符,这些文件是从名为“Word.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”,它将在整个数组中查找匹配的词对,这些词与“完全”匹配,包括大小写。之后,我将创建第三个函数,显示我先前创建的words.dat文件中的20个字符串和匹配的单词。

最佳答案

有几件事要注意。首先,我建议您让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;
}

10-08 08:20
查看更多