Scanf不接受第二个字符串

时间:2012-03-26 01:50:21

标签: c string scanf

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

3 个答案:

答案 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()来读取用户输入。

Everything you need to know about stdio.h