簡體   English   中英

scanf 和 printf 不打印正確的值

[英]scanf and printf not printing right values

這里發生了什么? 代碼如下:

#include<stdio.h>
#include<string.h>

int main()
{
    char name[15];
    char name_[15];
    char answ[1];

    printf("What's your name?\n");
    scanf("%s", name);

    strcpy(name_, name);

    printf("Yes / No: ");
    scanf("%s", answ);

    printf("Hello! %s\n", name_);
    printf("You said: %s\n", answ);

    return 0;
}

輸入“名稱”和“是”,預期的 output 是它說:

你好! 姓名

你說:是的

相反,我得到:

你好! es

你說:是的

我還嘗試在 %s 之前添加空格,但沒有結果。

那么我到底錯過了什么?

answ只能包含 1 個字符。 所以目前,額外的字符"es" + '\0'被寫入分配給name_的 memory 中。 因此, "es"被打印出來。

您只為一個字符是/否的答案分配了空間,但正在向其中寫入更多字符。

這會導致未定義的行為

您需要為answ分配更多空間,不要忘記 NUL 終止符。

您已經創建了一個經典的可利用緩沖區溢出,但在您的代碼中。 這就是為什么大多數現代編譯器會建議您將 sscanf 交換為 sscanf_s 或類似的。 正如其他人指出的那樣,您會覆蓋堆棧上的下一個變量。

我想提供這個答案基本上是說:永遠不要使用 sscanf 或任何過時的、不安全的 C 函數。 即使這可能只是一個玩具示例,也請練習編寫現代 C 代碼。 從長遠來看,您將從中受益。

暫無
暫無

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

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