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
谢谢!
答案 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;
}