Ваш начальный scanf()
в цикле читает все до EOF, так что ничего не осталось для «Какого слова вы хотели бы найти?»scanf()
для чтения.
Одним из способов решения этой проблемы является чтение начальных имен из файла (fopen()
, fscanf()
, fclose()
- и имя файла может быть аргументом для программыили фиксированное имя).
Другой способ, которым вы можете попробовать, - это clearerr(stdin);
перед словом "Что слово" scanf()
.Это (clearerr()
) сбрасывает бит EOF и позволяет scanf()
повторить попытку.Это может работать, если вход программы - терминал;это не поможет, если ввод программы происходит из файла.
int main(int argc, char **argv)
{
char names[320][30];
char str[30];
int i, j;
char *key;
int numOfWords;
char userWord[30];
Set set1, set2, set3;
FILE *fp;
if (argc != 2)
{
fprintf(stderr, "Usage: %s word-file\n", argv[0]);
exit(1);
}
if ((fp = fopen(argv[1], "r")) == 0)
{
fprintf(stderr, "Usage: %s word-file\n", argv[0]);
exit(1);
}
//scan each char string into array names
for (i = 0; i < 320 && fscanf(fp, "%29s", str) != EOF; i++)
{
strcpy(names[i], str);
}
fclose(fp);
//set number of words in file
numOfWords = i;
Это настаивает на том, что вы используете ./a.out example.dat
(вместо ./a.out < example.dat
).Затем он будет работать более или менее так, как вы хотите.Конечно, код для чтения файла должен быть в функции, которой передаются имя файла, массив и размер массива.Значение 320 в цикле защищено от переполнения и должно быть перечислением enum { MAX_WORDS = 320 };
, которое используется как в объявлении массива, так и в цикле.29
- защита от переполнения;это трудно параметризировать, но оно на единицу меньше второго измерения массива.