你好我无法弄清楚为什么a)最后一个副本上的这个代码错误和b)在调试器中它显示包含0到4然后包含1到4的picture [0](见图1)
char picture[5][5];
strcpy(picture[0], "#####");
strcpy(picture[1], "#####");
strcpy(picture[2], "#####");
strcpy(picture[3], "#####");
strcpy(picture[4], "#####");
当xcode错误时,它会显示以下内容
答案 0 :(得分:3)
在C
字符串中以字符\0
结尾。因此,您应通过将数组声明为:
char picture[5][6];
答案 1 :(得分:2)
当您声明char str[n]
时,表示为您保留n-1
个字符。而最后一个是'\ 0'字符(终结符)。如果你覆盖'\ 0'字符,它会继续打印,直到它在内存中找到'\ 0'。
所以将char picture[5][5];
修改为char picture[5][6];
答案 2 :(得分:1)
您忘记了需要一个空字节来终止字符串。 (实际上,你的最后一个strcpy()
在数组范围之外写入,调用未定义的行为。)使用:
char picture[5][6] = { "#####", "#####", "#####", "#####", "#####", };
这也可以节省strcpy()
次来电。
我评论道:
如果将6更改为5,编译器可能会生成警告,但我认为需要允许初始化器(即使它必须删除终止空字节)。但这是一个警告,你想要修复;它显示出一个真正的问题。
事实上,GCC 4.8.2甚至没有在相当严格的编译选项下警告这个问题。
汇编:
gcc -O3 -g -std=c11 -Wall -Wextra -Werror ols.c -o ols
代码:
#include <stdio.h>
static char picture1[5][5] = { "#####", "#####", "#####", "#####", "#####", };
static char picture2[5][6] = { "#####", "#####", "#####", "#####", "#####", };
int main(void)
{
for (int i = 0; i < 5; i++)
printf("%s\n", picture1[i]);
for (int i = 0; i < 5; i++)
printf("%s\n", picture2[i]);
return 0;
}
输出:
#########################
####################
###############
##########
#####
#####
#####
#####
#####
#####
答案 3 :(得分:0)
无论何时使用 strings.h 中的函数,请务必注意“\ 0”,否则在字符串末尾总会出现意外输出(特别是在打印时)使用%s )。编译器不会发出任何警告,因为它不会发现任何错误。使用%s 进行打印时,编译器将查找“\ 0”,并在运行程序时保持打印。实际上,当您使用strncpy进行应对时,如果数组大小为9而您只使用5,则其余4将存储 null 。