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

Why does this code in C++ give me a runtime error?

我正在尝试从用户那里获取字符输入,并将其类型转换为整数,例如 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 行作为输入(这不是这里的重要信息)。

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

operator >> 这里默认跳过空格,其中包括换行符 - 所以你永远不会看到一个。

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

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

Why does this code in C++ give me a runtime error?

  1. 因为你没有使用像std::arraystd::vector这样的安全高级设施,而不是容易出错的原始数组 .

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

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

这是您程序的一个更安全的现代版本:

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