C++ 我想声明一个指向字符的指针数组,而不使用字符串
代码如下:C++ 我想声明一个指向字符的指针数组,而不使用字符串,c++,C++,代码如下: #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<<
#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;
}
#包括
使用名称空间std;
常数int MAX=4;
int main()
{
字符键[20];
字符*名称[MAX];
对于(int i=0;i键;
名称[i]=键;
当运行names[i]=key;
时,不能将key
的字符串值复制到names[i]
它只是使name[i]
指向键所在的位置(因为name[i]
和key
都是指针)
总之,您要多次覆盖键
,并使所有名称
指针指向键
您需要通过使用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;
}
#包括
#包括
使用名称空间std;
常数int MAX=4;
int main()
{
字符串名[4];
对于(int i=0;i cout每次执行这些行时
cout << " entr keys\n";
cin >> key;
然后循环再次开始。无论如何,从第二次开始,您将将以null结尾的字符串插入键,从而覆盖以前的内容。第二次如果您输入了“hi\0”
,则键数组的内容将变为
['h', 'i', '\0', 'l', 'l', 'o', '\0']
无论如何,您将只打印第一个字符串,因为空终止符将阻止显示其他内容
当程序结束时,将有四个指向同一个键数组的指针,该数组将只包含插入的最后一个元素,该元素重写了前面的元素
为了解决此问题,可以将数组设置为二维数组(或使用数组):
const int MAX=4;
int main()
{
char键[4][20];//键[i];
名称[i]=键[i];
cout纠正程序:
#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;
}
#包括
使用名称空间std;
#包括
常数int MAX=4;
int main()
{
字符键[20];
字符*名称[MAX];
对于(int i=0;i键;
名称[i]=新字符[strlen(键)+1];//名称[i]=键;
strcpy(名称[i],键);
cout不使用string
您的代码准确地显示了您应该使用string的原因,您似乎不知道原始数组如何工作以及如何复制数据。提示:此命名[i]=key;
不复制key
指向的内容,它只复制key
指针本身。您需要足够的空间来容纳像key
这样的4个字符串,并且需要确保name
元素指向这些字符串,而不是总是指向key
。您需要使用strcpy()
或memmove()
将密钥复制到其他字符串中。或者,最好使用
和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;
}
#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;
}