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

时间:2014-02-24 03:25:40

标签: c arrays pointers char

你好我无法弄清楚为什么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错误时,它会显示以下内容

enter image description here

4 个答案:

答案 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