c:读取scanf语句中的字符返回垃圾值
我使用的是Ubuntu 14.04和GCC4.8.4c:读取scanf语句中的字符返回垃圾值,c,C,我使用的是Ubuntu 14.04和GCC4.8.4 #include<stdio.h> void main() { char c[15]; printf("enter a character\n"); scanf("%15c",c); printf("%s\n",c); } 当我以超过15个字符作为输入执行上述程序时,输出不会返回垃圾值。但当我执行下面的程序时: #include<stdio.h> void main()
#include<stdio.h>
void main()
{
char c[15];
printf("enter a character\n");
scanf("%15c",c);
printf("%s\n",c);
}
当我以超过15个字符作为输入执行上述程序时,输出不会返回垃圾值。但当我执行下面的程序时:
#include<stdio.h>
void main()
{
char c[5];
printf("enter a character\n");
scanf("%5c",c);
printf("%s\n",c);
}
#包括
void main()
{
charc[5];
printf(“输入字符\n”);
scanf(“%5c”,c);
printf(“%s\n”,c);
}
我给输入超过5个字符。它返回带有垃圾值的输出。指令
%c
用于读取单个字符和字符数组,但不用于专门用作c字符串的数组。特别是,它不会在从输入传输的最后一个字符之后存储空字符
因此,您的两个scanf()
调用都非常好,但随后的printf()
调用则不是。在每种情况下,由c
指定的数组的内容都不是以null结尾的,因此尝试通过%s
指令打印数组将导致scanf()
读取超过数组的结尾,从而产生未定义的行为。一种情况下的未定义行为对您来说似乎是合理的,而另一种情况下的未定义行为并非无关
我建议不要像现在这样使用未终止的字符串数组。最好使阵列足够大以容纳终止符,并确保它们实际上是终止的。但是,如果必须通过printf()
打印未终止或可能未终止的字符数组,请确保使用指令的精度字段限制可能打印的字符数:
#include<stdio.h>
int main(void) {
char c[5];
printf("enter a character\n");
scanf("%5c", c);
printf("%.5s\n", c);
}
#包括
内部主(空){
charc[5];
printf(“输入字符\n”);
scanf(“%5c”,c);
printf(“%.5s\n”,c);
}
如果您的输入超过5个字符,那么您的程序将完美地显示5个字符,然后开始显示垃圾值,因为在打印字符串时,它将打印到“\0”字符。如果“\0”最后不存在,它将打印垃圾。您在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;
}
#包括
内部主(空){
charc[15];
printf(“输入字符串”);
scanf(“%14s”,c);//将%c更改为%s
printf(“%s\n”,c);
返回0;
}
请注意,长度限制比数组大小小一个,以便为
nul
终止符留出空间。问题是%15c
和%5c
读取的值不是以null结尾的,因此两个代码都有未定义的行为。main()
的返回类型始终是int
,永远不要void
。这并不是这里的中心问题。@JohnBollinger虽然不是中心问题,但C允许void main()
per”或以其他实现定义的方式。“C11§5.1.2.2.1 1 1否,@chux。不管字段宽度如何,%c
指令告诉printf()
需要一个相应的int
参数,并将其转换为无符号字符进行打印。char*
作为相应的参数是不可接受的,如果传递了一个参数,则产生的未定义行为更可能是将指针值的某些部分解释为无符号char
,而不是输出任何指向的字符。是的,当然,您是正确的。一个“如果你还记得60年代-你不在那里”的时刻。
#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;
}