2012-03-26 66 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

相關問題