如何在char *末尾附加'\ n'?

时间:2018-07-09 14:32:49

标签: c++ string append escaping

这是我的代码,显示了我正在尝试执行的操作,但不起作用。

#include <iostream>

char * getNewStr(char *str)
{
    size_t oldsize = strlen(str);
    size_t newsize = oldsize + 2;
    str = static_cast<char *>(realloc(str, newsize));
    str[oldsize] = '\n';
    str[oldsize + 1] = '\0';
    return str;
}

int main(int argc, const char * argv[])
{
    char *str = const_cast<char *>("Hello World");
    char *newStr = getNewStr(str);
    std::cout << newStr << newStr;
    free(newStr);
    return 0;
}

我希望结果是

Hello World
Hello World

但是目前,它在realloc()部分崩溃了。

如何纠正功能getNewStr()使其起作用?

(PS:getNewStr()函数的参数和返回类型应为现在的char *。我不想在函数中使用std::string。)

2 个答案:

答案 0 :(得分:4)

documentation of realloc中,有以下行:

  

重新分配给定的内存区域。它必须事先由malloc(),calloc()或realloc()分配,并且尚未通过调用free或realloc进行释放。否则,结果是不确定的。

由于不是从*alloc函数获得字符串常量的字符指针,因此将其传递给重新分配是无效的。在这种情况下,未定义的行为表现为崩溃,但这不是标准所能保证的(因此为“未定义”)。

在这种情况下,您应该将字符串的副本传递给函数,并记住在完成处理后将其释放。

但是,实际上,如果您使用的是C ++,则应该使用std :: string。

答案 1 :(得分:2)

嗨,您可能应该使用字符串数据类型,并且可以通过以下更简单的方式实现期望的结果

#include <iostream>
using namespace std;

string getNewStr(string & str)
{
    str.append("\r\n");
    return str;
}

int main(int argc, const char * argv[])
{
    string str = "Hello World";
    string newStr = getNewStr(str);
    std::cout << newStr << newStr;
    return 0;
}