c - 获取字符串数组的意外输出
问题描述
a = 1;
b = 9;
char s[9][5]={"one","two","three","four","five","six","seven","eight","nine"};
for(int i=a;i<=b;i++)
{
if(i<10)
printf("%s\n",s[i-1]);
else
{
if(i%2==1)
printf("odd\n");
else
printf("even\n");
}
}
预期的:
one
two
three
four
five
six
seven
eight
nine
得到:
one
two
threefour
four
five
six
seveneightnine
eightnine
nine
解决方案
并非此数组的所有元素
char s[9][5]={"one","two","three","four","five","six","seven","eight","nine"};
包含一个字符串。元素的类型是char[5]
。因此,例如字符串文字"three"
不完全包含在数组的第三个元素中,因为没有空间来存储'\0'
字符串文字的终止零字符,并且转换说明符%s
旨在输出字符,直到'\0'
遇到终止零字符。这就是出现这样的输出的原因
threefour
seveneightnine
eightnine
所以要么你需要增加数组元素的大小,比如
char s[9][6]= { /*...*/ };
或在调用中使用以下格式字符串printf
printf("%.*s\n", 5, s[i-1]);
注意这个 if 语句
if(i<10)
没有多大意义,因为 i 总是小于 10。
推荐阅读
- python - 如何将返回类型指定为类中另一个方法的返回类型
- javascript - 找到最近的 3d 点
- c++ - QT QML 访问“ui.qml”文件中的根上下文属性
- python - 烧瓶中的返回按钮
- javascript - 在 Elementor 中替换单词并添加样式 Javascript 片段:Hello Wordpress 主题
- r - 为什么 predict.glm() 不能以预期的方式创建预测值?
- regex - 正则表达式 - 排除字符串中的单词
- swift - 嵌套 Cloudkit 查询未按正确顺序打印
- recursion - 为什么递归函数的时间复杂度是 2^n?
- java - @PostMapping 与多个 RequestBody