我有一个二进制搜索功能,可以搜索数组中的单词,但在搜索数组之前,我需要知道要搜索的单词。我编写了代码来询问用户输入,但程序打印出输入请求但不接受用户的任何内容。我认为这是一个缓冲区问题,因为我在程序中有一个初始scanf,它从外部文件加载所有字符串并将它们放在一个数组中。我在初始scanf之后尝试使用fflush,并尝试使用gets重写第二个,如前面的线程所指出的那样。也许我没有正确实现它。以下是我到目前为止所提出的关于为什么第二个scanf无法正常工作的任何提示。
#include "set.h"
#include "sortAndSearch.h"
#include <stdio.h>
#include <ctype.h>
#include <string.h>
int main(){
char names[320][30];
char str[30];
int i, j;
char *key;
int numOfWords;
char userWord[30];
Set set1, set2, set3;
//scan each char string into array names
for(i=0; scanf("%s", str) != EOF; i++){
strcpy(names[i], str);
}
//set number of words in file
numOfWords = i;
//sort names array
//bubbleSort(names, numOfWords);
//print out names, sorted
//for(i=0; i<numOfWords; i++){
// printf("%s\n", names[i]);
//}
printf("What word would you like to search for? ");
scanf("%s", userWord);
//addName2Set(set1, userWord);
return 0;
}
答案 0 :(得分:4)
您的第二个scanf
无效,因为您的第一个scanf
永远不会终止。除非输入流已关闭,否则scanf
将不会返回EOF
。这将是控制台关闭的。
由于scanf
返回读取的字符数,您应该改为循环条件scanf(%s, str) != 0
。一旦用户点击进入而没有输入任何内容,这将使循环结束。
答案 1 :(得分:0)
你的初始scanf()
在一个循环中读取所有内容到EOF,所以没有什么可以留下'你要搜索什么单词?' scanf()
阅读。
解决此问题的一种方法是从文件(fopen()
,fscanf()
,fclose()
中读取初始名称 - 文件名可能是程序的参数,或者固定名称)。
您可以尝试的另一种方法是在{What word'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
是溢出保护;很难对它进行参数化,但它比数组的第二维小一个。
答案 2 :(得分:0)
乍一看,你的问题和代码似乎非常错位......
scanf()
是错误的功能,用于从您的文件中读取,您需要fscanf()
,或者如果文件格式化为每个单词都在其自己的行fgets()
上也可以正常工作(换行)停止阅读每个字符串)。同样,如果输入只是一个字符串后跟return(换行符),则可以使用gets()
而不是scanf()
来读取用户输入。