繁体   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