[英]Scanf not accepting second char string
我有一個二進制搜索功能,可以在數組中搜索單詞,但是在搜索數組之前,我需要知道要搜索的單詞。 我已經編寫了代碼來詢問用戶輸入,但是程序會打印出輸入請求,但不接受用戶的任何東西。 我當時以為這是一個緩沖區問題,因為我在程序中有一個初始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;
}
您的第二個scanf
無效,因為您的第一個scanf
永不終止。 除非關閉輸入流,否則scanf
不會返回EOF
這可能是控制台關閉了。
由於scanf
返回讀取的字符數,因此您應該使循環條件scanf(%s, str) != 0
。 這將使循環在用戶未輸入任何內容的情況下立即結束。
循環中的初始scanf()
讀取EOF之前的所有內容,因此“想搜索什么單詞?”一無所有。 scanf()
讀取。
解決此問題的一種方法是從文件中讀取初始名稱( fopen()
, fscanf()
, fclose()
,並且文件名可能是程序的參數,也可能是固定名稱)。
您可以嘗試的另一種方法是clearerr(stdin);
在'What 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
是溢出保護; 很難對其進行參數化,但是它比數組的第二維小一。
乍一看,您的問題和代碼似乎完全錯位了……
scanf()
是錯誤的函數,您想要從文件中讀取文件,您想要fscanf()
,或者如果文件格式被格式化為每個單詞都在其fgets()
行上,則fgets()
可以工作(換行停止讀取每個字符串)。 同樣,如果輸入只是一個字符串,然后是return(newline),則可以使用gets()
而不是scanf()
來讀取用戶輸入。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.