c - 在 C 中使用 sprintf 时出现意外的数组行为
问题描述
apply 后我面临着奇怪的行为sprintf
:list[0]
似乎刚刚消失,结果strlen
is 0
。然后我尝试申请strcpy
,strlen
达到预期并返回3
。所以我的问题是为什么sprintf
会抹去我的,如果我坚持申请,我list[0]
该如何恢复价值?提前致谢。list[0]
sprintf
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main() {
char list[5][7] = { "One", "Two", "Three", "Four", "Five" };
char item[7];
int i = 0;
for (i = 0; i < 5; i++) {
sprintf(item, "%-7s", list[i]);
//strcpy(item, list[i]);
}
printf("%d", strlen(list[0]));
}
解决方案
您的代码具有未定义的行为,因为%-7s
目标数组中至少需要 8 个字节:左对齐字符串为 7 个字节,空终止符为 1 个字节。请注意,如果任何字符串的长度超过 7 个字节,则目标数组中将需要更多空间。
这个错误可以解释观察到的行为:sprintf
向 写入 8 个字节item
,即一个字节太多,如果数组list
在 结束后在内存中开始item
,它的第一个字节将被空字节覆盖,导致list[0]
被截断并成为长度为 0 的空字符串。
您应该使用snprintf
它来防止缓冲区溢出并使您的数组至少有 8 个字节长。
另请注意,main
它的返回类型为int
.
这是修改后的版本:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char list[5][7] = { "One", "Two", "Three", "Four", "Five" };
char item[8];
for (int i = 0; i < 5; i++) {
snprintf(item, sizeof item, "%-7s", list[i]);
}
printf("%d\n", strlen(list[0]));
return 0;
}
推荐阅读
- c# - c#如何将变量从方法传递到main?
- c - 在我的 C 程序中使用 execvp 函数执行 grep 时挂起
- vb.net - 使用 do 循环的 Visual Basic 变量验证
- css - 真正响应式的内容栏,带有侧边栏,没有媒体查询
- node.js - Ubuntu、NodeJs 和环境文件
- reactjs - 我正在尝试通过反应从 Api 获取数据,一个 api 取决于“id”第二个,
- javascript - 如何在 Javascript 中从不同的类中调用一个类?(初学者问题)
- python - 带有彩条的情节甘特图
- javascript - 向导提交按钮问题,我认为js中的这个表单向导问题
- excel - ExcelVBA Q:如何替换字符的第一个实例并删除相同字符的第二个实例之后的所有内容