我有一个大小可变的字符数组,可从用户输入中接收。从那里,我根据大小输入带for循环的数组,但似乎保存大小的变量正在变化,并且陷入无限循环。
char arr_1[] = {};
int array_size;
cout << "Array size: ";
cin >> array_size;
for (int i = 0; i < array_size; i++)
{
cout << "Input: ";
cin >> arr_1[i];
}
答案 0 :(得分:3)
我有一个大小可变的字符数组
char arr_1[] = {};
在C ++中,没有诸如“可变大小的数组”之类的东西。数组的大小永远不变。此外,非动态数组的大小必须是编译时间常数。您声明的数组大小为零。大小为零的非动态数组格式错误。
如果编译器由于某种原因未能发现该错误(也许它支持零长度数组作为语言扩展),那么最终您将无法访问该数组。超出范围访问数组的行为是不确定的。无限循环是不确定行为的一个例子。
但是有一个标准容器,当您向其中插入元素时,它会自动重新分配一个逐渐变大的数组:std::vector
。
尽管,由于您要处理字符,因此也许应该将它们表示为字符串。为此有一个特殊的容器:std::string
。
答案 1 :(得分:1)
为此,您必须使用std :: string:
#include <string>
#include <iostream>
int main()
{
std::string input;
std::getline(std::cin, input);
}
我们使用getline
而不是cin <<
,因为后者仅读取单词,而不读取整个字符串。
您甚至不需要询问用户阵列的大小;让标准库对此有所担心。
从中学到的教训是使用给您的工具,而不是尝试“自己动手”,因为这样做容易出错并且浪费时间。
还要注意,它是C,而不是C ++,它具有可变长度的数组。
答案 2 :(得分:1)
在这种情况下,Vector比数组更适合使用。甚至更容易使用字符串:
#include <iostream>
#include <string>
using namespace std;
int main()
{
int numChars = 0;
string word("");
cout << "Num chars you want to input: ";
cin >> numChars;
for (int i = 0; i != numChars; ++i)
{
string input("");
cout << "Enter a char: ";
cin >> input;
if (input.size() == 1)
word += input;
else
{
cout << "Invalid input- exiting";
getchar();
exit(0);
}
}
cout << "Your word: " << word;
getchar();
getchar();
}