【问题标题】:Using cin for char array将 cin 用于 char 数组
【发布时间】:2015-06-11 05:20:00
【问题描述】:

这是我的代码:

#include <iostream>
using namespace std;

int main(){
    char inp[5], out[4];
    cin >> inp >> out;
    cout << inp << endl;
    cout << out << endl;
    system("pause");
    return 0;
}

当我输入时:

12345 6789

它给了我:

6789

为什么我没有保存 5 个字的 char 数组 'inp' 却什么也没显示?第二个输入看起来很正常。但是,当我设置 out[3] 或 out[5] 时,它似乎可以正常工作?似乎 [5] 后跟 [4] 的两个 char 数组会导致问题...

【问题讨论】:

  • 您首先将 11 个字符(包括结尾的 '\0')写入 5 个字符的数组。幸运的是,当时没有发生任何爆炸。然后将另外 11 个字符写入 4 字符数组。在out 的空间用完后,数据溢出到inp。修复数组大小,或限制输入的长度。

标签: c++ arrays char cin


【解决方案1】:

这是因为,在计算机的内存布局中,out[4]是先布局后inp[5]的。像这样的东西: 输出[0],输出[1],输出[2],输出[3],输入[0],输入[1],输入[2],输入[3],输入[4]

因此,当您在 out[4] 中写入 6789 时,会将空字符溢出到 inp[0]。因此,inp 变为 NULL。

【讨论】:

  • 取决于字节序。
  • 嗨!这是一个非常古老的问题,正如一些 cmets 和答案所指出的,它的代码中有很多问题。如果您有兴趣回答有关 C++ 的一些新问题,请查看此列表 stackoverflow.com/questions/tagged/c%2b%2b
【解决方案2】:

当你读入一个字符数组时,流会一直读取直到遇到空格,流不知道你传入的数组的大小,所以很高兴地写到数组的末尾,所以如果你的第一个字符串更长超过 4 个字符,您的程序将有未定义的行为(在您输入空终止符后使用一个额外的字符)。

幸运的是,c++20 有 fixed this issue,流操作符不再接受原始字符指针,只接受数组,最多只能读取 size - 1 个字符。

即使使用 c++20,更好的解决方案是将您的类型更改为 std::string,这将接受任意数量的字符,甚至告诉您它包含多少个字符:

#include <iostream>

int main(){
    std::string inp, out;
    std::cin >> inp >> out;
    std::cout << inp << "\n";
    std::cout << out << "\n";
    return 0;
}

【讨论】:

    【解决方案3】:

    我看到您输入(类型)1234567890 字符来为inp[5] 输入数据 - 这是一个问题,因为imp 数组能够存储 4 个字符和空终止符。当cin &gt;&gt; inp 将超过 4 个字符存储到inp 数组时,会导致数据出现问题(类似于未定义的行为)。因此解决方案可以为数据分配更多内存,例如:

        #include <iostream>
        using namespace std;
    
        int main(){
            char inp[15], out[15];  // more memory
            cin >> inp >> out;
            cout << inp << endl;
            cout << out << endl;
            system("pause");
            return 0;
        }
    

    【讨论】:

    • 我刚刚发现了一些奇怪的东西。仅当我将第一个数组的大小设置为 5 并且将第二个数组的大小设置为 4 时才会出现问题。当我将第二个数组的数组大小设置为 5 甚至 3 时,问题就消失了。我用输入 12345 和 6789 而不是长数字编辑了我的问题
    • 为了正确存储5个字符数组必须至少有6个char项,因为cin &gt;&gt;在用户输入的字符之后添加'\0'(以及scanf函数)
    猜你喜欢
    • 1970-01-01
    • 2013-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 2014-07-31
    • 2011-11-06
    • 1970-01-01
    相关资源
    最近更新 更多