c++ - C和C++的区别 : array size is not honored

标签 c++ c arrays

我正在学习 C++,但我发现了一个我不理解的行为。如果我用 C 编写以下程序:

#include <stdio.h>

int main() {
    char question[] = "What is your name? ";
    char answer[2];
    printf(question);
    scanf("%ls", answer);
    printf("%s\n", answer);
    return 0;
}

当我输入一个超过两个字节的名字时,答案是一些乱码,但即使我不知道确切原因,我也知道出了点问题并且它试图恢复。
相反,如果我编写这个 C++ 程序(有点等同于前者):

#include <iostream>

using namespace std;

int main() {
    char question[] = "What is your name? ";
    char answer[2];
    cout << question;
    cin >> answer;
    cout << answer << endl;
    return 0;
}

我希望有类似的行为,因为我将 answer 声明为字符数组而不是字符串(可以动态调整其大小)。但是当我输入很长的内容时,它会在我输入时打印回来。一个例子:

$ ./test
What is your name? asdfa
asdfa
$ ./test
What is your name? sdhjklwertiuoxcvbnm
sdhjklwertiuoxcvbnm

那么,这里发生了什么?作为次要问题,当我输入更长的内容时,C 语言会发生什么?

编辑:澄清一下,我知道我可以使用 std::string 而不是 char 数组(我已经在上面写过了 ^^)。我很想知道为什么程序表现出那种行为。现在我知道这是未定义的行为。此外,我更正了 C 程序 (scanf) 中的错误。

最佳答案

char answer[2]; 表示您的数组只能包含 2 个字符。如果你压得更多,内存就会溢出,这是未定义的行为。要么在数组中保留足够的空间,要么在不强制使用数组时更好地使用 std::string。正如其他答案所指出的那样,您正在以错误的方式接受输入。

关于c++ - C和C++的区别 : array size is not honored,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23655767/

相关文章:

javascript - 推送到数组不会触发 vue 的 react

c++ - 具有纯虚方法的抽象类 - 为什么可以执行 "Abstract * abs3;"?

c++ - 在 Raspberry pi 上运行 OSX openFrameworks 项目的最简单方法是什么?

C++ 异常处理器 : terminate ist always called

c - C 中的算术平均程序

javascript - 输出带有子数组和数字对象的大型嵌套数组

c++ - 一种在没有光线转换和多个目标的情况下使用 3D 寻路的方法

不使用强制转换运算符比较 unsigned int 和 int

c - 在 C 中将 Hex 写入文件(不是 ASCII)

javascript - 在 JavaScript 中打包二进制数据