动态分配的字符串数组,然后更改它的值?
Dynamically allocated string array, then change it's value?
我正在尝试创建一个字符串数组并使用指针对其进行修改。我不知道如何声明指针,因为字符串的长度可能不同,我认为这就是导致错误的原因。
我的代码看起来像这样:
#includes <string>
#includes <iostream>
using namespace std;
string *users = NULL;
int seatNum = NULL;
cin >> seatNum;
users = new string[seatNum];
string name;
cin >> name;
users[seatNum] = name;
当我试图更改其值时,它会引发写入访问冲突。从我所读到的内容来看,这是因为字符串被编译为只读的,所以我的问题是我该如何更改它?易于理解的解释会更好。
您访问的内存超出了分配的数组的范围
users = new string[seatNum];
users[seatNum] = name;
第一个元素是[0]。最后一个是[seatNum-1]
您已经创建了一个seatNum
元素数组。数组元素索引从0
开始,因此有效索引的范围是[0, seatNum - 1]
。通过访问users[seatNum] = ...
,您实际上已经超过了数组的最后一个有效元素。这会调用UB(未定义的行为)。
我看到您已经做出了正确的选择,使用std::string
而不是C样式的字符串。为什么不在阵列上做出同样的选择呢?
#include <string>
#include <array>
#include <iostream>
int main(int, char*[]) {
int seatNum = 0;
std::cin >> seatNum;
std::vector<std::string> users(seatNum);
std::cin >> users[0];
return 0;
}
尽量避免使用指针和C样式数组,尤其是动态数组。
几件事:
-
int seatNum将在堆栈上分配,并且永远不会为NULL。您应该将其设置为0。
-
您设置的用户[seatNum]超出了限制,导致程序崩溃。你只能使用从0到seatNum-1的索引。
更新:Chris是正确的。我研究了一下,字符串在C++中确实是可变的。
首先,不能将null值设置为int类型数据
int seatNum = NULL; // wrong
int seatNum = 0; // right
从0到seatnum-1 的第二个字符串边界
users[seatNum-1] = name; // right
相关文章:
- 如何在字符串中找到字符,然后在C++中提取其余的字符串
- 将子字符串字符从字符串值转换为 int,然后将其分配给 int 变量
- 字符串变成链表,然后检查括号余额
- 我正在尝试从输入文件中读取,然后使用它们的子字符串比较字符串的特定部分
- 比较字符串的 GetLine 工作一次,然后比较之后不起作用
- C++ 按数值对元组<字符串、浮点数>然后按字典顺序排序的向量
- C++读取大文件并将其保存到字符串中,然后删除特定的随机单词
- 如何创建一个C++程序来读取字符串数组中的信息,然后将其排序到类中?
- 检查字符串是否是数字,然后将该数字转换为 int?
- 如何根据长度然后字母顺序对数组字符串进行排序?
- 将 int 转换为字符串,然后连接另一个变量以创建完整扩展名,然后将其转换为 const_char*
- 如何将两个 jlong 数据类型转换为 jstring,然后将两个字符串连接在一起以便从 JNI 将字符串返回给 jav
- 当找到来自 RHS 的字符"\"时,从主字符串中获取单词或子字符串,然后擦除其余部分
- 将无符号字符转换为字符串,然后再次转换为无符号字符
- 在构造函数中创建一个字符串数组,然后在主函数中使用它
- C 从文件中读取文本,然后将字符串解析为int数组
- JNI将字符串从Java传递到C ,然后将C 字符串传递给字符串数组
- C :在字符串中找到一个char,然后在先前的char之后找到另一个字符
- 获取一个输入字符串,将其转换为其十六进制值,然后将其十六进制存储为 int
- 文字符号和字符串变量之间的串联然后返回常量字符*