为什么 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?
因为你没有使用像std::array
或std::vector
这样的安全高级设施,而不是容易出错的原始数组 .
您犯的错误导致未定义的行为。 int f[8];
是一个包含 8 个元素的数组,索引从 0 到 7,但稍后,在您的循环中,您的条件显示 counter <= 8
,其中 包含 8。它应该是 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
.
- 用
static_cast
替换了 C 风格的转换。
- 使用了基于范围的 C++11
for
循环。无需在循环条件中对数组的大小进行硬编码。
- 删除了
using namespace std;
,这几乎总是不好的做法,初学者根本不应该使用。
- 删除了您的
\n
检查,它永远不会起作用,因为 std::cin >> input;
忽略所有空格。您将不得不使用 std::getline
来获得您想要的行为。事实上,您无论如何都想这样做,以便在您的程序中进行一些实际的错误处理。
- 局部变量的最小范围。
- 不保证字符 A 的整数值为 65。写成
'A'
. 更安全(也更可读)
我正在尝试从用户那里获取字符输入,并将其类型转换为整数,例如 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?
因为你没有使用像
std::array
或std::vector
这样的安全高级设施,而不是容易出错的原始数组 .您犯的错误导致未定义的行为。
int f[8];
是一个包含 8 个元素的数组,索引从 0 到 7,但稍后,在您的循环中,您的条件显示counter <= 8
,其中 包含 8。它应该是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
. - 用
static_cast
替换了 C 风格的转换。 - 使用了基于范围的 C++11
for
循环。无需在循环条件中对数组的大小进行硬编码。 - 删除了
using namespace std;
,这几乎总是不好的做法,初学者根本不应该使用。 - 删除了您的
\n
检查,它永远不会起作用,因为std::cin >> input;
忽略所有空格。您将不得不使用std::getline
来获得您想要的行为。事实上,您无论如何都想这样做,以便在您的程序中进行一些实际的错误处理。 - 局部变量的最小范围。
- 不保证字符 A 的整数值为 65。写成
'A'
. 更安全(也更可读)