簡體   English   中英

c編程:(scanf和gets)

[英]c programming: (scanf and gets)

我知道scanf()和gets()函數之間的區別在於scanf()繼續讀取輸入字符串,直到遇到空格,而gets()繼續讀取輸入字符串,直到遇到\\ n或EOF(文件末尾)。

為了了解這種作用的差異,我嘗試自己編寫一個示例,如下所示:

                 #include <stdio.h>
                  int main()
                {    
                   char a[20];
                   printf("enter the string\n");
                   scanf("%s",&a);
                   printf("the string is %s\n",a);
                   char b[20];
                   printf("enter the string\n");
                   gets(b);
                   printf("the string is %s\n",b);
                   return 0;
                }

當給變量a字符串“ manchester united”作為輸入時,輸出為:

                   enter the string
                   manchester united
                   the string is manchester
                   enter the string
                   warning: this program uses gets(), which is unsafe.
                   the string is  united

我期望的輸出只是給變量a的字符串的第一部分,即曼徹斯特,然后程序提示我輸入變量b的新輸入字符串。 相反,我最終得到了上面給出的輸出。

根據輸出,我了解的是:

可以看出,scanf()遇到空白后,它將立即停止讀取字符串,因此,即使程序沒有提示我輸入,字符串的其余部分:united也已分配給變量b。變量b的字符串。

如何清除分配給變量a的字符串的其余部分(空格后的部分)?

這樣,我可以為變量b輸入一個全新的輸入字符串。

非常感謝您對代碼執行中在這里發生的任何進一步的解釋。

對於最基本的錯誤表示歉意(從響應中可以明顯看出)! 只是C編程的新手:)

您可以通過手動讀取和丟棄字符來刷新它,直到找到'\\n'或有人按下適當的組合鍵導致EOF為止。 或者您可以要求scanf()放棄所有內容,直到找到'\\n' ,第二個可以這樣實現

char string[20];
scanf("%19s%*[^\n]\n", string);

您的代碼還有其他錯誤

  1. 您將a聲明為由20個char的數組,然后將其地址傳遞給scanf() ,該地址需要char指針,該數組名稱( 如果需要,可以使用變量 )會在需要時自動轉換為char指針。

  2. 您使用過gets() ,它是一個古老的危險且已棄用的函數,不再是標准函數。 您應該改用fgets() ,它使用一個參數來使事件溢出目標數組。

這是測試建議的修復程序的示例

#include <stdio.h>

int
main(void)
{    
    char string[20];

    string[0] = '\0'; /* Avoid Undefined behaviour 
                         when passing it to `fprintf()' */

    scanf("%19s%*[^\n]\n", string);
    fprintf(stdout, "%s\n", string);

    fgets(string, sizeof(string), stdin);
    fprintf(stdout, "%s\n", string);

    return 0;
}

暫無
暫無

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

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