2013-10-20 24 views
0

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

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; 
} 
+1

有复制一个字符串,并赋值为指针之间的差异。 – Beta

回答

2

的问题是你要arr[i]每次,从不改变分配的line地址(不完全)。它导致arr的所有条目指向相同的位置。

你可以做到这一点..

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

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

更新:由于在评论中提到,你实际上是分配线的内部表示的地址。

+0

比这更糟糕的是,他分配了'line'的内部表示的地址,并且如果'line'由于任何原因(例如循环中的getline()'调用)需要重新分配,它就可以改变。 – Blastfurnace

+0

@ Blastfurnace-同意。我只是用通俗的话来写,但我已经为此更新了答案。谢谢! :) – vidit

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); 

其中strncpy<cstring>头部声明。

0

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

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

0

您所遇到的情况显示返回的内容是指向内部数组的指针。

string::c_str状态的文档为C++98

程序不得改变任何一个字符在这个序列中。

这并没有明确表示它是内部缓冲区,但留给实施建议不要改变它,因为它可能指向内部缓冲区。

而对于C++11它明确规定这是在内部缓冲器

指针返回指向当前使用的字符串对象来存储符合其值中的字符的内部阵列。

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

所以,你需要的是内容到您以前分配的数组复制:

std::strcpy (arr[i], line.c_str()); 
相关问题