2012-03-26 76 views
0

我有一个二进制搜索功能,这将在数组中的单词搜索,但在此之前我可以搜索数组我需要知道搜索什么词。我已经编写了代码,要求用户输入,但程序打印出输入请求,但不接受用户的任何内容。我认为这是一个缓冲区问题,因为我在程序中有一个初始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; 
} 
+0

如果你想读取输入的*线*,使用函数读取一行。否则,您正在阅读该单词并将行结束。 – 2012-03-26 01:58:05

回答

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。

+0

为什么scanf不会在data.dat文件的末尾终止? – manalishi 2012-03-26 02:02:49

+0

文件名不固定,它在程序运行时提供,./a.out manalishi 2012-03-26 02:05:38

+0

'clearerr(stdin);'也没有这个伎俩。初始输入来自外部文件,第二个输入来自终端内部。 – manalishi 2012-03-26 02:10:15

4

你的第二个scanf不工作,因为你的第一个scanf永远不会终止。除非输入流被关闭scanf不会返回EOF - 这将是控制台关闭。

由于scanf返回字符数念你应该将让你的循环条件scanf(%s, str) != 0。这将使循环结束,只要用户点击进入而不输入任何内容。

+0

我改了'for(i = 0; scanf(“%s”,str)!= 0; i ++)''但现在我得到一个分段错误 – manalishi 2012-03-26 02:02:15

+0

EOF在那里,因为它正在从外部文件输入并且我不知道该文件中有多少数据。在第二次扫描之前不会提示用户。 – manalishi 2012-03-26 02:12:00

+0

'你的意思是'第一个'scanf()永远不会执行'?如果输入是从文件重定向的(对这种情况有一个注释,那么循环会重复执行'scanf()'直到文件结束。如果输入来自终端,则在Windows上输入control-Z或在Unix上输入control-D(通常)将终止输入。在任何情况下,循环中的'scanf()'都可以很好地执行。 – 2012-03-26 02:27:17

0

你的问题和代码乍一看似乎非常错位......

scanf()是错误的功能从文件读取,你想fscanf(),或者如果该文件被格式化为使得每个字是自己的行fgets()也可以工作(换行符停止读取每个字符串)。同样,如果输入只是一个字符串,然后返回(换行符),则可以使用gets()而不是scanf()来读取用户输入。

Everything you need to know about stdio.h

相关问题