【问题标题】:Does the cin function add null terminated at the end of input? [closed]cin 函数是否在输入末尾添加 null 终止? [关闭]
【发布时间】:2018-11-11 15:18:47
【问题描述】:

如果我声明一个字符数组:char arr[200] 然后我随后使用函数 cin 将值读入arr[200] 然后我在命令行窗口中输入:abcd

是否有一个空终止:\0 自动添加到输入末尾的数组中?

(我不这么认为,因为我使用 cin 函数对其进行了测试: cin>>abcd )

谁能给我解释一下为什么?

下面是我用来测试的代码的 sn-p

    char arr[200]
    int count=0;
    int i=0;
    cin>>arr // i type into command window:abcd

    while (arr[i] != '\0')
    {
       count++;
        i++




    }

我的计数值不会是 4,而是像 43,因此我得出结论,字符数组在 cin 函数后不是空终止的

【问题讨论】:

  • 你应该看看这里:cplusplus.com/forum/articles/6046
  • 我编辑了这个问题以便更好地理解
  • i 和 count 均未初始化。
  • 我试过初始化,结果是一样的
  • @Lim:您正在测量读入数组之前的长度。那时,它包含垃圾,因此您可以获得任何结果。您在此处发布的代码正确地测量了 阅读后的长度。

标签: c++ user-input c-strings


【解决方案1】:

按照 C++11 27.7.2.2.3/9 中的规定,从 std::istream 到字符数组的格式化输入将以空值终止输入:

operator>> 然后在下一个位置存储一个空字节(charT()

一旦明显的语法错误得到修复,您发布的代码就会给出预期的结果。但请注意,这是非常危险的;没有检查数组的长度,所以太多的输入会溢出它。我强烈建议您使用 std::string 类而不是普通字符数组来管理字符串。

您通过link 在评论中发布的代码如下所示:

char array[20];
int length=getlength(array);
cin>>array;

在尝试测量未初始化数组的字符串长度之后读取数组。这可能会产生任何结果、崩溃或导致任何其他未定义行为的示例。

以后,您应该确保您在问题中发布的代码与您所询问的行为的代码相同;否则无法回答问题。

【讨论】:

    【解决方案2】:

    是的,输入将以零结尾。否则,例如,您将无法在输入后不打印随机字符的情况下打印它。

    【讨论】:

    • 那为什么我的计数值是43
    • @RayLim 它不在这里。你的编译器坏了。
    • @Lim 您提供的代码与您在问题中发布的代码不同。您在将任何内容放入数组之前检查getLength,因此该值不明确,不应在实际初始化变量之前进行测试。
    • @TheCapn 代码是 C++,数组没有 length 属性。除此之外,您是正确的。
    猜你喜欢
    • 1970-01-01
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    • 2018-04-15
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多