【问题标题】:cin.getline() without using string sizecin.getline() 不使用字符串大小
【发布时间】:2014-02-10 08:06:08
【问题描述】:

是否可以使用cin.getline() 而不表示数组大小? 也就是用下面的伪代码:

char array[15];
cin.getline(array,'.');  // '.' Is the delimiter.

这行得通吗?

【问题讨论】:

  • 即使我假设您正在处理 c++,您通常也应该用您正在处理的语言标记您的问题。

标签: c++ cin getline istream


【解决方案1】:

是的:加入 20 世纪 (!) 世纪:

std::string str;
std::getline(std::cin, str, '.');

【讨论】:

    【解决方案2】:

    会发生什么:

    这将编译并运行,但您的分隔符将不起作用,您将获得未定义的行为。此外,当未给出数组大小时,您将失去 1) 异常处理。 (当输入大于大小时,你会得到一个2)“堆栈损坏”运行时错误)。给定尺寸后,剩余的长度将被剪掉。

    1) 异常处理:

    如果您为数组定义大小,它将为用户输入子串,这样您在字符串中写入的字符不会超过分配的空间。 (即超过 15 个)(这种类型的子字符串只有在您定义大小时才可用。

    2) 堆栈损坏错误:

    如果不定义大小,您将收到“堆栈损坏错误”,这意味着您尝试写入的内容超出分配的内容。

    3) 运行您的代码: 您的代码将运行,但您在运行时会有未定义的行为。

    http://coliru.stacked-crooked.com/a/64b881aa9f70c21d

    以正确的方式做事: 正如已经提到的“轨道上的闪电赛跑”,这是要走的路:

    std::string str;
    std::getline(std::cin, str, '.');
    

    更多阅读:http://www.cplusplus.com/reference/string/string/getline/

    【讨论】:

    • Furthermore you will loose [sic] exception handling, when the array size is not given 丢失了什么样的异常处理?
    • When the input is higher than the size, you will get a "stack corrupted" run-time error 如果你很幸运的话。更常见的是,您只会破坏/破坏其他一些对象。
    • This will compile and run 假设你说的是char array[]no, it won't
    • 他的问题是,如果它行得通,我只是在描述他的台词的行为。但我完全从“什么时候会发生什么”的角度来看待它,而不是“如何阅读用户输入”
    • 我在质疑你回答的准确性。我将我的问题分解为个人问题。
    猜你喜欢
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2022-11-25
    • 1970-01-01
    • 1970-01-01
    • 2022-12-17
    相关资源
    最近更新 更多