这是代码::
#include <iostream>
using namespace std;
const int MAX = 4;
int main ()
{
char key[20];
char *names[MAX];
for (int i=0; i<MAX; i++)
{
cout << " entr keys\n";
cin >> key;
names[i]=key;
cout<< names[i];
}
for(int i=0; i<MAX;i++)
{
cout << names[i];
}
return 0;
}
当我输入密钥并在第一个for
循环中打印它们时,它们会显示正确的值,但是当我在第二个names[i]
循环中打印for
时,它会一直显示最后一个密钥一次又一次地进入。
请告诉我:我哪里错了?
答案 0 :(得分:3)
当您运行names[i]=key;
时,您并未真正将key
的字符串值复制到names[i]
。
只需将name[i]
指向key所在的位置(因为name[i]
和key
都是指针)。
总而言之,你多次覆盖key
,并使所有names
指针指向键。
您需要使用std::string
代替char*
或使用strcpy
来复制这些字符串。我建议使用std::string
。
使用std::string
您的代码应如下所示:
#include <iostream>
#include <string>
using namespace std;
const int MAX = 4;
int main ()
{
string names[4];
for (int i = 0; i < MAX; i++)
{
cout << "entr keys" << endl;
cin >> names[i];
cout << names[i];
}
for(int i=0; i<4;i++)
{
cout << names[i];
}
return 0;
}
答案 1 :(得分:3)
每次执行行
cout << " entr keys\n";
cin >> key;
您将以空字符结尾的字符串插入key
,例如"hello\0"
。
然后复制key
的地址并将其存储到名称指针数组的单元格中:
names[i]=key; // Now I point to 'key'
cout<< names[i];
然后循环再次开始。无论如何,你第二次将以null结尾的字符串插入密钥,从而覆盖以前的内容。第二次如果输入"hi\0"
,key
数组的内容将变为
['h', 'i', '\0', 'l', 'l', 'o', '\0']
无论如何,您只打印第一个字符串,因为空终止符将阻止显示其他内容。
当程序结束时,您将有四个指向同一个键数组的指针,该数组将只包含插入的最后一个元素,它覆盖了之前的元素。
为了解决这个问题,你可以使你的数组成为二维数组(或使用string数组):
const int MAX = 4;
int main ()
{
char key[4][20]; // <- Now this has two indices
char *names[4];
for (int i = 0; i < MAX; i++)
{
cout << " entr keys\n";
cin >> key[i];
names[i]=key[i];
cout<< names[i];
}
for(int i=0; i<4;i++)
{
cout << names[i];
}
return 0;
}
答案 2 :(得分:1)
更正程序:
#include <iostream>
using namespace std;
#include <cstring>
const int MAX = 4;
int main ()
{
char key[20];
char *names[MAX];
for (int i = 0; i < MAX; i++)
{
cout << " entr keys\n";
cin >> key;
names[i] = new char[strlen(key) + 1];//names[i]=key;
strcpy(names[i], key);
cout<< names[i];
}
for(int i=0; i<MAX;i++)
{
cout << names[i];
}
for(int i=0; i<MAX;i++)
{
delete [] names[i];
}
return 0;
}
您需要为每个名称[i]分配空间,完成后,请取消分配 另外,将硬编码4改为MAX