1

我已经 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" directoryio = "/home/demian/archredes/" 第一次打印:/home/demian/archredes/feo 第二次打印:/home/demian/archredes/fA

谢谢!

4

5 回答 5

2

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

char *cstr = new char [directorio.size() + nom.size() + 1];
于 2013-09-19T15:22:00.383 回答
2

您通过修改 astd::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;
}
于 2013-09-19T15:22:56.690 回答
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;
于 2013-09-19T15:22:59.313 回答
0

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

于 2013-09-19T15:24:30.380 回答
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;
}
于 2013-09-19T15:37:12.790 回答