我试图从用户那里获取char输入,并将其类型化为整数,例如A = 1; B = 2 ... Z = 26;并将其存储在一个数组中。 这是代码:
#include <iostream>
using namespace std;
int main(){
char input;
int f[8];
int counter;
for(counter = 0; counter <= 8; counter++){
cin >> input;
f[counter] = (int)input - 64;
if(input == '\n') break;
}
cout << f[0] << endl; }
if(input = '\n') break;
行给了我一个错误。我试图打破进入新线路的循环。这有什么不对?我试图这样做,因为我输入2行作为输入(这里不是重要的信息)。
答案 0 :(得分:1)
为什么C ++中的代码会给我一个运行时错误?
因为您不使用std::array
或std::vector
等安全的高级设施,而不是容易出错的原始数组。
您所犯的错误会导致未定义的行为。 int f[8];
是一个包含8个元素的数组,索引从0到7,但稍后在您的循环中,您的条件为counter <= 8
,其中包含 8.它应该是{{ 1}}。访问counter < 8
是未定义的行为。
未定义的行为意味着编译器可以在程序中构建任何行为,包括崩溃并显示错误消息。
这是您的程序更安全,更现代的版本:
f[8]
一些变化:
#include <iostream>
#include <array>
int main() {
std::array<int, 8> f;
for(auto&& element : f) {
char input;
std::cin >> input;
element = static_cast<int>(input) - 'A' + 1;
}
std::cout << f[0] << "\n";
}
。std::array
替换了C风格的演员。static_cast
循环。无需在循环条件下对数组的大小进行硬编码。for
,这几乎总是不好的做法,初学者根本不应该使用。using namespace std;
支票,这将永远不会有效,因为\n
会忽略所有空格。您必须使用std::cin >> input;
来获得所需的行为。实际上,无论如何,您都希望这样做,以便在您的程序中获得一些实际的错误处理。std::getline
更安全(且更具可读性)。答案 1 :(得分:0)
程序正在给你一个运行时错误,因为你的Array循环超出范围。 for(counter = 0; counter <= 8; counter++)
。
您应该使用for(counter = 0; counter < 8; counter++)
。
答案 2 :(得分:0)
operator >>
会跳过空格,其中包含换行符 - 所以您永远不会看到空格。
为避免您需要使用cin.get()
。还有其他选择 - 您可以使用getline
一次读取一行,然后解析您获得的string
。
当然,修改你的下标也是一个好主意。