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;icout每次执行这些行时

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