簡體   English   中英

如何在C編程中掃描兩個或更多個包含空格的字符串?

[英]How to scan two or more strings containing spaces in C programming?

我正在嘗試運行此代碼,但無法正常工作。任何人都可以告訴我該代碼出了什么問題。

int main()
{
    char   name[100],college_name[100],address[100];
    printf("Enter your name :");
    scanf("%[^\n]s",name);
    printf("Enter college name :");
    scanf("%[^\n]s",college_name);
    printf("Enter address :");
    scanf("%[^\n]s",address);
}

您的scanf調用正確地讀取了所有內容,但包括\\n

問題是\\n保留在輸入流上。 因此,當第二個和第三個scanf調用運行時,它們什么也找不到。 (他們最多讀取零個字符,但不包括下一個\\n 。)

最簡單的解決方法是調用getchar()讀取並丟棄\\n字符:

#include <stdio.h>

int main()
{
    char name[100],college_name[100],address[100];
    printf("Enter your name :");
    scanf("%[^\n]",name);
    getchar();       /* discard \n */
    printf("Enter college name :");
    scanf("%[^\n]",college_name);
    getchar();       /* discard \n */
    printf("Enter address :");
    scanf("%[^\n]",address);
    getchar();       /* discard \n */
}

(我還從scanf調用中刪除了多余的s字符。它是%[] ,不是%[]s 。)

現在,從一個方面來說,這是一個較差的解決方案。 從理論上講,我們應該檢查getchar()讀取的字符實際上是\\n 但是(a)在這種情況下幾乎是必須的,並且(b)任何使用scanf讀取用戶輸入的程序都已經很笨拙並且不可靠,因此添加一些笨拙而且可能不可靠(但簡單)的getchar調用不會更糟了。

(有人會建議-甚至有人建議-調用fflush(stdin)擺脫多余的換行符。這可能在某些平台上有效,但不能保證一定會用到,並且在任何地方都無法使用,所以它甚至是更糟糕的解決方法。)

真正的教訓是,不要使用scanf的用戶輸入。 不幸的是,在這樣的開始程序中,它顯然是用戶輸入的首選,因為它看起來是如此簡單和方便。 但事實證明,(當你試圖讓實際的工作方案) scanf實際上只是方便不可能左右,所以只要你已經學到了一點關於C,你會想放棄scanf完全,並盡一切使用更強大,更可靠的技術來輸入您的信息。 (您的下一個問題可能是更可靠的技術,例如什么?一種方法是使用fgets()讀取用戶輸入的行,然后根據需要操縱這些行。另請參見http://c-faq.com/stdio/scanfprobs .htmlhttps: //www.eskimo.com/~scs/cclass/notes/sx10h.htmlhttps://www.eskimo.com/~scs/cclass/notes/sx12e.html 。)

暫無
暫無

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

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