将数据复制到C中的空字符串时发生意外截断

时间:2017-11-06 14:56:58

标签: c arrays gcc

我是C初学者并编写程序将字符串从一个字符数组复制到另一个字符数组:

<input type='submit' id='yes' name='yes' value='Yes'/> 

我很好奇的是,上面的代码最终会将原始字符串截断为前面的一个字符:

unexpected output

但下面的代码(声明/初始化数组originalString和newVariable交换的顺序)按预期工作。

#include <stdio.h>

void stringCopy(char s[], char t[]);

int main(void){
    char originalString[] = "pineapple"; // original string first
    char newVariable[] = ""; // empty string initialised and declared after
    stringCopy(newVariable,originalString);
    printf("Original string data: %s\n",originalString);
    printf("String in new variable: %s",newVariable);
    return 0;
}

void stringCopy(char s[], char t[]){
    int i=0;
    while((s[i] = t[i]) != '\0')
        i++;
}

expected output

为什么在首先初始化空字符串/字符数组时它会起作用,而不是相反?在初始化/声明之前,函数似乎正在修改原始字符串。新的空字符串。

我所做的就是交换初始化/声明数组的顺序。

(正在使用GCC / G ++编译器,不会对任何一种情况给出任何警告或错误)

1 个答案:

答案 0 :(得分:2)

您需要分配空间来填充字符串。

像这样的空字符串,

char emptyString[] = "";

的大小为1个字节,您无法调整其大小。

这应该被理解为“声明一个数组并使用""常量”对其进行初始化,从而产生一个大小为1但仅包含null的数组}终结者。

您需要通过明确指定大小来分配空间

char emptyString[10] = "";

现在这个数组允许复制到它。