[英]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.