赋值,stry和strlen与字符数组n指针

C++ Assignment, strcpy and strlen with character arrays n pointers

本文关键字:字符 数组 指针 strlen stry 赋值      更新时间:2023-10-16

我正在做这个作业,遇到了一个问题。在某一点上,我必须要求用户输入两个稍后使用的命令,并且我希望将它们放在一个字符数组中。然后我想把他们的输入放到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);
}

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

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

char * command1[5];

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

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

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

阅读更多:http://www.cplusplus.com/reference/cstdlib/malloc/

Gabe Sechan的解决方案也是有效的。new和malloc是c++和C分配内存的方法)

这里有附加问题:

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

ansLenfirstAns的长度,有可能大于5。在这种情况下,如果你试图访问command1[i],你将访问超出边界的内存,导致段错误。

同时,正如Patashu和Gabe指出的那样,您正在使用统一的command1