将字符附加到char的结尾

时间:2013-10-05 18:45:57

标签: c

我正在尝试在我的char的末尾附加一个空格,这是我正在测试的代码,它会抛出Bus Error;

int main() {
    char* test = "Test";
    printf("%s\n", test);
    strcat(test, "a");
    printf("%s\n", test);
    return 0;
}

3 个答案:

答案 0 :(得分:6)

"Test"是字符串文字,不允许您修改它。如果你改变:

char * test = "Test";

为:

char test[10] = "Test";

它会像你期望的那样工作。

编辑:在评论中,有一些关于这是否应该导致编译器警告的讨论。在C中,char * test = "Test";格式完美,不应导致任何警告。在任何理智的实现中,strcat()将在很长一段时间内被编译,因此它不会给你任何警告,因为它期望char *作为它的第一个参数,这就是你传递它的内容,这不应该导致警告。有可能你有一个非常聪明的编译器,它记得你将test指向一个字符串文字并且没有指向其他任何东西,因为知道{{1}它会改变它,但这似乎不太可能,所以我怀疑你在这里得到任何警告。这是你必须要知道和避免的事情之一。

我相信C ++的情况有所不同。使用strcat()进行编译会给我一个g++ -std=c++11警告,您可以通过更改为deprecated conversion from string constant to 'char *'来消除此问题。当您尝试将const char * test = "Test";传递给const char *时,会出现新错误strcat(),期望普通char *。 C ++类型检查比使用C更严格。

答案 1 :(得分:4)

这里的主要问题是test指向文字字符串,文字字符串是常量,因此是只读的。尝试更改文字字符串是未定义的行为

如果要将字符附加到字符串,则必须先将其分配。在堆上(例如malloc)在堆栈上作为数组。分配的内存也必须足够大才能容纳额外的字符,在你的情况下它必须至少有六个字符:四个用于字符串"Test",一个用于字符'a'和一个对于终止所有字符串的特殊字符。

答案 2 :(得分:0)

int main() {
    char* test = malloc(NUMBER_OF_BYTES);
    strcpy(test,"Test");
    printf("%s\n", test);
    strcat(test, "a");
    printf("%s\n", test);
    return 0;
 }