簡體   English   中英

c:在scanf語句中讀取字符將返回垃圾值

[英]c : Reading character in scanf statement returns garbage value

我正在使用Ubuntu 14.04和gcc 4.8.4

 #include<stdio.h>
 void main()
 {
     char c[15];
     printf("enter a character\n");
     scanf("%15c",c);
     printf("%s\n",c);
 }

輸出:

enter a character
qwertyuiopasdfghjkl
qwertyuiopasdfg

當我以超過15個字符作為輸入執行上述程序時,輸出不會返回垃圾值。 但是當我執行以下程序時:

#include<stdio.h>
void main()
{
    char c[5];
    printf("enter a character\n");
    scanf("%5c",c);
    printf("%s\n",c);
}

我輸入的字符數超過5個。 它返回帶有垃圾值的輸出。

%c指令用於讀取單個字符和字符數組,但不適用於專門用作C字符串的那些數組。 特別是,它不會在從輸入傳遞的最后一個字符之后存儲空字符。

因此,您的兩個scanf()調用都很好,但隨后的printf()調用卻不是。 在每種情況下, c所指定的數組的內容都不以空值結尾,因此,嘗試通過%s指令打印數組將導致scanf()讀取數組的末尾,從而產生不確定的行為。 在一種情況下,未定義的行為對您來說似乎是合理的,而在另一種情況下,未定義的行為與您無關。

我建議不要在操作時使用未終止的類似字符串的數組。 最好使數組足夠大以用作終結器,並確保它們實際上被終結了。 但是,如果必須通過printf()打印未終止或可能未終止的字符數組,那么請確保使用指令的precision字段來限制可以打印的字符數:

#include<stdio.h>

int main(void) {
    char c[5];
    printf("enter a character\n");
    scanf("%5c", c);
    printf("%.5s\n", c);
}

您在scanf為字符串使用了錯誤的格式說明符。

#include <stdio.h>

int main(void) {
    char c[15];
    printf("enter a string\n");
    scanf("%14s", c);               // change %c to %s
    printf("%s\n", c);
    return 0;
}

請注意,長度限制比數組大小小一,以便為nul終止符nul空間。

如果輸入的字符數超過5個,則程序將完美顯示5個字符,然后開始顯示垃圾值,因為在打印字符串時,它最多可以打印'\\ 0'個字符。 如果最后不存在“ \\ 0”,它將打印垃圾。

暫無
暫無

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

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