c - 在 C 中将数据复制到空字符串时出现意外截断

标签 c arrays gcc

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

#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++;
}

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

unexpected output

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

#include <stdio.h>

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

int main(void){
    char newVariable[] = ""; // empty string initialised and declared first
    char originalString[] = "pineapple"; // original string data 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++ 编译器,对于任何一种情况都不会给出任何警告或错误)

最佳答案

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

像这样的空字符串,

char emptyString[] = "";

大小为 1 字节,并且无法调整其大小。

这应该被理解为“声明一个数组并使用”“常量初始化它”,得到一个大小为1的数组仅包含 null 终止符。

您需要通过显式指定大小来分配空间

char emptyString[10] = "";

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

关于c - 在 C 中将数据复制到空字符串时出现意外截断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47139737/

相关文章:

gcc - 我可以告诉 gcc/ld 排除未使用的模块吗?

c - 为什么freetype渲染出来的文字总是有些杂音?

c++ - 将函数标记为脏(指定调用者应保存所有寄存器)

c - 为什么第二个数组写的是愚蠢的数字? - C语言

JavaScript 引用多个具有相似名称的图像而不链接到每个图像

c - 使用 Cygwin 编译 C 程序;执行错误

c++ - 我们需要原子地增加线程局部变量吗?

c - 我如何使用 strdup?

c++ - 在 C/C++ 中使用 JACK 和 fftw 的音频频谱

c - 在 C 中将 char 数组作为函数参数传递