首页 > 解决方案 > 为什么这段代码不能打印数组中的字符?

问题描述

我使用 gcc (tdm-1) 5.1.0 编译了这段代码,请告诉我为什么输出不包含“hello”

#include<stdio.h>
void main()
{
    int i;
    char st[20];
    printf("Enter a string ");
    scanf("%s",st);
    for(i=0;i<20;i++)
{
    printf("%c",st[i]);
}

}

输入:你好 输出:@@

标签: c

解决方案


您打印数组的所有 20 个元素,但如果用户输入的字符串小于该字符串,则并非所有元素都会被初始化。它们将是不确定的,看似随机的。

请记住,charC 中的字符串实际上称为空终止字节字符串。该空终止位很重要,这意味着您可以通过再次检查当前字符'\0'(即终止符)轻松找到字符串的结尾。

或者您可以只使用该strlen函数来获取字符串的长度:

for(i=0;i<strlen(st);i++) { ... }

或者使用"%s"格式打印字符串:

printf("%s", st);

另请注意,在没有任何保护的情况下,该scanf函数将允许您提供比数组中空间更长的输入,因此您需要对其进行保护,例如通过限制scanf将读取的字符数量:

scanf("%19s",st);  // Write at most 19 character (*plus* terminator) to the string

现在为什么您的输入似乎没有被打印出来,这是因为未初始化元素的不确定内容。虽然您不会超出数组的范围,但您仍然会超出实际字符串的范围。越界会导致未定义的行为

可能正在发生的是,一些“随机”不确定的内容恰好是一个回车'\r',它将光标移动到行首,并且已经写入的输出将被数组中未初始化的元素覆盖。


推荐阅读