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