我试图创建一个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;
}