C ++赋值,strcpy和strlen,带有字符数组n个指针

时间:2013-04-17 03:48:48

标签: c++ arrays pointers

我正在完成这项任务并遇到了问题。有一次,我必须要求用户输入两个输入命令,我希望它们放在一个char数组中。然后我想将它们的输入放入char *但我最终得到了分段错误

以下是我的代码的一小部分,显示我遇到问题的地方:

#include <iostream>
#include <cstring>
using namespace std;

int main(){

char firstAns[80];
char * command1[5];
int ansLen;

//Ask for command
cout << "Please enter your first command(incl. args) or quit: ";
cin >> firstAns;

ansLen = strlen(firstAns);
for(int i=0; i < ansLen; i++){
strcpy(command1[i], firstAns);
}

我运行的程序编译得很好,但是我已经将分段错误缩小到程序的这一部分,并且可以使用一些帮助作为新手程序员:)

3 个答案:

答案 0 :(得分:4)

你有一个名为char *的char *数组。但是你没有为数组中的指针分配任何内存,甚至没有将它们设置为null。所以它们是随机值,指向随机存储位置。然后,Strcpy会覆盖这些随机位置,从而导致seg故障。您需要首先在所有5行上按command[i]=new char[80]为这些指针分配内存。

答案 1 :(得分:0)

char * command1[5];

这是一个char*的数组。然而,它是未初始化的 - 值可以是任何值,因此它们指向内存中随机,无意义的位置。

然后您在command1[i]中使用未初始化的strcpy(command1[i], firstAns);。从本质上讲,你所做的是在内存中随机放置并尝试将firstAns复制到它。难怪你的程序崩溃了!

在使用指针之前,必须将其初始化为某个值。如果您需要在内存中存储,请使用malloc()返回正确大小的存储(sizeof(datatype)*length +1,如果它是一个字符串)并记住free()当您返回时从它返回的指针完成它。

了解详情:http://www.cplusplus.com/reference/cstdlib/malloc/

(Gabe Sechan的解决方案也有效.new和malloc是分配内存的C ++和C方式)

答案 2 :(得分:0)

其他问题在这里:

  ansLen = strlen(firstAns);
  for(int i=0; i < ansLen; i++){
     strcpy(command1[i], firstAns);
  }

ansLenfirstAns的长度,有可能长于5.在这种情况下, 如果您尝试访问command1[i],您将访问超出界限的内存,从而导致段错误。

与此同时,正如Patashu和Gabe所指出的那样,你正在使用酉command1