赋值,stry和strlen与字符数组n指针
C++ Assignment, strcpy and strlen with character arrays n pointers
我正在做这个作业,遇到了一个问题。在某一点上,我必须要求用户输入两个稍后使用的命令,并且我希望将它们放在一个字符数组中。然后我想把他们的输入放到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);
}
ansLen
是firstAns
的长度,有可能大于5。在这种情况下,如果你试图访问command1[i]
,你将访问超出边界的内存,导致段错误。
同时,正如Patashu和Gabe指出的那样,您正在使用统一的command1
。
- 指向指向字符数组的指针数组的指针
- 比较字符数组
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 使用无符号字符数组有效存储内存
- 错误:字符数组的初始值设定项太多
- 对字符数组中的元素执行逐位操作
- C++ 无法在字符数组中使用 for 循环打印字母模式
- 如何在 C++ 中从文件中读取字符数组(带有一些空格)
- C++ 传递二维字符数组
- 无法在 C++ 中输入字符数组
- 字符数组中的元素数
- 我的目标是编写一个程序来计算和存储字符串在字符数组中出现的位置
- 使用字符数组作为 Map 中的键
- C++:__aligned(__alignof__) 导致字符数组数据出现问题?
- 按顺序声明的字符数组重叠
- 在 C++ 中字符串的大小与字符数组的大小
- 寻找一种更好的方法来表示无符号字符数组
- 如何打印 2D 字符数组C++
- 从字符数组的元素中减去'a'是什么意思
- 我是否不正确地集中了这些字符数组?