SCANF不接受第二个字符的字符串
我有一个二进制搜索功能,这将在数组中的单词搜索,但在此之前我可以搜索数组我需要知道搜索什么词。我已经编写了代码,要求用户输入,但程序打印出输入请求,但不接受用户的任何内容。我认为这是一个缓冲区问题,因为我在程序中有一个初始scanf,它从外部文件加载所有字符串并将它们放入数组中。在我的初始scanf之后,我尝试过使用fflush,并且我尝试用gets来重写第二个,就像在前面的线程中指出的那样。也许我没有正确实施它。这是我到目前为止,关于为什么第二个scanf不工作的任何提示,赞赏。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;
}
你在一个循环的初始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
是溢出保护;很难对其进行参数化,但比数组的第二维小1。
你的第二个scanf
不工作,因为你的第一个scanf
永远不会终止。除非输入流被关闭scanf
不会返回EOF
- 这将是控制台关闭。
由于scanf
返回字符数念你应该将让你的循环条件scanf(%s, str) != 0
。这将使循环结束,只要用户点击进入而不输入任何内容。
我改了'for(i = 0; scanf(“%s”,str)!= 0; i ++)''但现在我得到一个分段错误 – manalishi 2012-03-26 02:02:15
EOF在那里,因为它正在从外部文件输入并且我不知道该文件中有多少数据。在第二次扫描之前不会提示用户。 – manalishi 2012-03-26 02:12:00
'你的意思是'第一个'scanf()永远不会执行'?如果输入是从文件重定向的(对这种情况有一个注释,那么循环会重复执行'scanf()'直到文件结束。如果输入来自终端,则在Windows上输入control-Z或在Unix上输入control-D(通常)将终止输入。在任何情况下,循环中的'scanf()'都可以很好地执行。 – 2012-03-26 02:27:17
你的问题和代码乍一看似乎非常错位......
scanf()
是错误的功能从文件读取,你想fscanf()
,或者如果该文件被格式化为使得每个字是自己的行fgets()
也可以工作(换行符停止读取每个字符串)。同样,如果输入只是一个字符串,然后返回(换行符),则可以使用gets()
而不是scanf()
来读取用户输入。
如果你想读取输入的*线*,使用函数读取一行。否则,您正在阅读该单词并将行结束。 – 2012-03-26 01:58:05