C 将字符串复制到字符串数组中

C 将字符串复制到字符串数组中,c,arrays,pointers,char,C,Arrays,Pointers,Char,您好,我不明白为什么a)这段代码在最后一次复制时出错,b)在调试器中它显示了包含0到4的图片[0],然后包含1到4(请参见图片) 当xcode出错时,它会显示以下内容 您忘记了需要一个空字节来终止字符串。(事实上,您最后的strcpy()写入数组边界之外,调用未定义的行为。)使用: 这也节省了strcpy()调用的时间 我评论说: 如果将6更改为5,编译器可能会生成警告,但我认为需要允许初始值设定项(即使它必须删除终止的空字节)。但这是一个警告,你会想要修复;这是一个真正的问题 事实上,GCC

您好,我不明白为什么a)这段代码在最后一次复制时出错,b)在调试器中它显示了包含0到4的图片[0],然后包含1到4(请参见图片)

当xcode出错时,它会显示以下内容


您忘记了需要一个空字节来终止字符串。(事实上,您最后的
strcpy()
写入数组边界之外,调用未定义的行为。)使用:

这也节省了strcpy()调用的时间


我评论说:


如果将6更改为5,编译器可能会生成警告,但我认为需要允许初始值设定项(即使它必须删除终止的空字节)。但这是一个警告,你会想要修复;这是一个真正的问题

事实上,GCC4.8.2甚至没有在相当严格的编译选项下警告这个问题

汇编:

gcc -O3 -g -std=c11 -Wall -Wextra -Werror ols.c -o ols
代码:


您忘记了需要一个空字节来终止字符串。(事实上,您最后的
strcpy()
写入数组边界之外,调用未定义的行为。)使用:

这也节省了strcpy()调用的时间


我评论说:


如果将6更改为5,编译器可能会生成警告,但我认为需要允许初始值设定项(即使它必须删除终止的空字节)。但这是一个警告,你会想要修复;这是一个真正的问题

事实上,GCC4.8.2甚至没有在相当严格的编译选项下警告这个问题

汇编:

gcc -O3 -g -std=c11 -Wall -Wextra -Werror ols.c -o ols
代码:


C
中,字符串以字符
\0
结尾。因此,您应通过将数组声明为:

char picture[5][6];

C
中,字符串以字符
\0
结尾。因此,您应通过将数组声明为:

char picture[5][6];

当您声明
char str[n]
时,意味着
n-1
字符是为您保留的。而最后一个是'\0'字符(终止符)。如果覆盖“\0”字符,它将继续打印,直到在内存中找到“\0”


所以修改
char图片[5][5]
字符图片[5][6]

当您声明
char str[n]
时,它意味着
n-1
字符是为您保留的。而最后一个是'\0'字符(终止符)。如果覆盖“\0”字符,它将继续打印,直到在内存中找到“\0”


所以修改
char图片[5][5]
字符图片[5][6]

无论何时使用strings.h中的函数,请确保注意“\0”,否则您总是会在字符串末尾得到意外的输出(尤其是在使用%s打印时)。编译器不会给出任何警告,因为它不会发现任何错误。当您使用%s打印时,编译器将查找“\0”,并在运行程序之前一直打印。事实上,当您使用strncpy时,如果数组大小为9,而您仅使用5,则其余4个数组中将存储null

每当您使用strings.h中的函数时,请确保注意“\0”,否则您总是会在字符串末尾获得意外的输出(特别是使用%s打印时)。编译器不会发出任何警告,因为它不会发现任何错误。使用%s打印时,编译器将查找“\0”,并在运行程序之前一直打印。事实上,当您使用strncpy时,如果数组大小为9,而您仅使用5,则其余4个数组中将存储null

谢谢。我想我尝试了您之前给出的语法,但它不起作用(尽管这可能也是一个空字节问题)。如果将6更改为5,编译器可能会生成警告,但我认为需要允许初始值设定项(即使它必须删除终止的空字节)。但这是一个警告,您可能想修复;它显示了一个真正的问题。是的,我修复了它,但后来我真的没有使用它们,因为这是一个永远不会结束的for循环。谢谢。我想我尝试了您之前给出的语法,但它不起作用(尽管它可能也是一个空字节问题)。如果将6更改为5,编译器可能会生成警告,但我认为需要允许初始值设定项(即使它必须删除终止的空字节).但这是一个警告,您可能想修复;它显示了一个真正的问题。是的,我修复了它,但后来我真的没有使用它们,因为它是一个永远不会结束的for循环。谢谢
#########################
####################
###############
##########
#####
#####
#####
#####
#####
#####
char picture[5][6];