Char * to string c ++(结果不是预期的)

时间:2013-09-19 15:15:24

标签: c++ printf

我已经花了4个小时试图解决这个问题,但我不能。我有这个功能:

  string getRuta(int i, char* buffer, string directorio) {
    int j = 0;
    string nom;
    char s;
    do {
            s = (char) buffer[i];
            nom[j] = s;
            j++;
            i++;
    } while (buffer[i] != 13);
    nom[j] = '\0';
    char *cstr = new char();
    strcpy(cstr, directorio.c_str());
    strcat(cstr, nom.c_str());
    printf("%s\n",cstr);
    string ruta = cstr;
    printf("%s\n",ruta.c_str());
    return ruta; }

我无法理解为什么但是在第一次打印时我得到了预期的输出,但第二次打印出一些奇怪的东西。我给你功能输入和打印结果。

buffer =“share feo” directorio =“/ home / demian / archredes /” 第一次打印:/ home / demian / archredes / feo 第二次印刷:/ home / demian / archredes / fA

谢谢!

5 个答案:

答案 0 :(得分:2)

您似乎在变量cstr中为整个字符串分配了1个字节的内存。尝试:

char *cstr = new char [directorio.size() + nom.size() + 1];

答案 1 :(得分:2)

您通过修改std::string个字符超过其结尾(nom[j] =行)来调用未定义的行为。您应该使用其push_back成员函数,以及直接连接字符串而不是使用char缓冲区。

此外,你只分配一个字符,然后strcpy方式通过它...并泄漏它的指针。

此外,您使用幻数而不是字符常量\r

这是一个更正(更简单)的版本:

string getRuta(int i, char const* buffer, string directorio) {
    string nom;
    char c;
    do {
        c = buffer[i];
        nom.push_back(c);
        i++;
    } while (buffer[i] != '\r');

    string ruta = directorio + nom;
    printf("%s\n",ruta.c_str());
    return ruta;
}

答案 2 :(得分:1)

以这种方式混合C和C ++并不是明智之举。如果您正在编写C ++代码,那么尽可能避免使用C风格的代码。现在在这段代码中:

char *cstr = new char();
strcpy(cstr, directorio.c_str());
strcat(cstr, nom.c_str());

cstr是指向1 char的指针。您可能意味着分配一个数组:

char *cstr = new char[directorio.size() + nom.size() - 1];

你正在使用std::string个对象,所以你应该做的是:

std::string ruta = directorio + nom;

答案 3 :(得分:0)

您需要分配完整的字符数组而不是单个字符。因为你使用strcpy破坏了内存,因为你分配了1个字符,然后将更多的数据复制到该空间中。

答案 4 :(得分:0)

代码太多,C / C ++字符串混合不好。

简短版本:

// Precondition: i is a valid index into the buffer.
// Use a const char* (please)
// Use std::size_t (maybe)
string getRuta(std::size_t i, const char* buffer, string directorio) {
    std::size_t k = i;
    // Test for end of string and '\r' == 13
    while(buffer[k] && buffer[k] != '\r') ++k;
    // Append the whole range once, to reduce the number of 
    // possible reallocations:
    return directorio.append(buffer + i, k - i);
}

int main()
{
    const char* buffer = " World\r\n Planet";
    std::cout << getRuta(0, buffer, "Hello") << std::endl;
    return 0;
}