为什么C ++中的这段代码会给我一个运行时错误?

时间:2016-01-30 09:28:19

标签: c++ char runtime newline

我试图从用户那里获取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行作为输入(这里不是重要的信息)。

3 个答案:

答案 0 :(得分:1)

  

为什么C ++中的代码会给我一个运行时错误?

  1. 因为您不使用std::arraystd::vector等安全的高级设施,而不是容易出错的原始数组

  2. 您所犯的错误会导致未定义的行为int f[8];是一个包含8个元素的数组,索引从0到7,但稍后在您的循环中,您的条件为counter <= 8,其中包含 8.它应该是{{ 1}}。访问counter < 8是未定义的行为。

  3. 未定义的行为意味着编译器可以在程序中构建任何行为,包括崩溃并显示错误消息。

  4. 这是您的程序更安全,更现代的版本:

    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风格的演员。
    • 使用基于C ++ 11范围的static_cast循环。无需在循环条件下对数组的大小进行硬编码。
    • 删除for,这几乎总是不好的做法,初学者根本不应该使用。
    • 删除了using namespace std;支票,这将永远不会有效,因为\n会忽略所有空格。您必须使用std::cin >> input;来获得所需的行为。实际上,无论如何,您都希望这样做,以便在您的程序中获得一些实际的错误处理。
    • 最小化局部变量的范围。
    • 不保证字符A具有整数值65.编写std::getline更安全(且更具可读性)。

答案 1 :(得分:0)

程序正在给你一个运行时错误,因为你的Array循环超出范围。 for(counter = 0; counter <= 8; counter++)。 您应该使用for(counter = 0; counter < 8; counter++)

答案 2 :(得分:0)

默认情况下,

operator >>会跳过空格,其中包含换行符 - 所以您永远不会看到空格。

为避免您需要使用cin.get()。还有其他选择 - 您可以使用getline一次读取一行,然后解析您获得的string

当然,修改你的下标也是一个好主意。