簡體   English   中英

Scanf不接受第二個字符字符串

[英]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()來讀取用戶輸入。

您需要了解有關stdio.h的所有信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM