Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c:读取scanf语句中的字符返回垃圾值_C - Fatal编程技术网

c:读取scanf语句中的字符返回垃圾值

c:读取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()

我使用的是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()
{
    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;
}