0

我的 char 数组只存储最后输入的字符串。例如,如果我输入 A、B、C、D 和 E,它会打印出 E 5 次。

string line = " ";
char** arr = new char*[5];

int i = 0;

for(i = 0; i < 5; ++i)
    arr[i] = new char[10];



for(i = 0; i < 5; i++){
    getline(cin, line);
    arr[i] = (char*)line.c_str();
}

for(i = 0; i < 5; i++){
    cout<< arr[i] << endl;
}
4

4 回答 4

2

问题是您每次都在分配地址(不完全是),它永远不会改变linearr[i]它导致所有条目都arr指向同一位置。

你可以这样做..

for(i = 0; i < 5; i++){
    getline(cin, line);

    strncpy(arr[i], line.c_str(), 10);
}

更新:如评论中所述,您实际上是在分配线路内部表示的地址。

于 2013-10-20T00:08:09.327 回答
0

这可能是string::c_str()返回对实际底层数组的引用的情况(即,c_str()如果返回的字符串被修改,则返回的数组被修改)。返回常量数组的事实本身c_str()应该警告您,您不应该将该数组视为在您的控制之下。

你犯的另一个错误是arr[i] = (char*)line.c_str();. 您之前使用 为 arr[i] 分配了内存arr[i] = new char[10];,但第二个分配擦除了第一个分配,导致内存泄漏。我相信你想做的是

strncpy(arr[i], line.c_str(), 10);

wherestrncpy在标头中声明<cstring>

于 2013-10-20T00:12:08.083 回答
0

'arr' 是一个指针数组。您用五个字符数组的地址初始化这些指针。但是在您的 getline 循环中,您将每个指针设置为指向“line”变量的地址。结果是它们都指向内存中的同一个字符串(并且您刚刚将五个 char 数组泄漏到以太中!)。

提示:尝试使用字符串复制函数将 'line' 的内容复制到每个 char 数组中。确保您只复制最多 10 个字符!

于 2013-10-20T00:13:26.103 回答
0

您所遇到的表明返回的是指向内部数组的指针。

string::c_str的文档说明了C++98

程序不得更改此序列中的任何字符。

这并没有明确说明它是内部缓冲区,而是将其留给实现,建议不要更改它,因为它可能指向内部缓冲区。

而因为C++11它明确指出这是内部缓冲区

返回的指针指向字符串对象当前用于存储符合其值的字符的内部数组。

string::data 和 string::c_str 都是同义词并且返回相同的值。

因此,您需要将内容复制到先前分配的数组中:

std::strcpy (arr[i], line.c_str());
于 2013-10-20T00:22:46.903 回答