c - 为什么这段代码不能打印数组中的字符?
问题描述
我使用 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]);
}
}
输入:你好 输出:@@
解决方案
您打印数组的所有 20 个元素,但如果用户输入的字符串小于该字符串,则并非所有元素都会被初始化。它们将是不确定的,看似随机的。
请记住,char
C 中的字符串实际上称为空终止字节字符串。该空终止位很重要,这意味着您可以通过再次检查当前字符'\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'
,它将光标移动到行首,并且已经写入的输出将被数组中未初始化的元素覆盖。
推荐阅读
- python - 如何运行这个 python 脚本?
- javascript - 你是怎么做到的,当网站打开时,WhatsApp聊天弹出窗口会自动出现
- lua - Neovim 0.5 在保存时组织导入
- node.js - 如何在 Sequelize 中对两个不同的条件执行嵌套查询?
- sql - 如何从具有总值为 0 的列的表中获取不同的记录计数
- visual-studio-2019 - 无法加载cs文件(vs2019)
- ios - CoreML MLModel 预测进度
- typescript - 具有重载函数的打字稿映射类型
- javascript - NodeJS 中间件调用顺序
- reactjs - React - JSX 映射中的 console.log