【发布时间】:2014-02-10 08:06:08
【问题描述】:
是否可以使用cin.getline() 而不表示数组大小?
也就是用下面的伪代码:
char array[15];
cin.getline(array,'.'); // '.' Is the delimiter.
这行得通吗?
【问题讨论】:
-
即使我假设您正在处理 c++,您通常也应该用您正在处理的语言标记您的问题。
是否可以使用cin.getline() 而不表示数组大小?
也就是用下面的伪代码:
char array[15];
cin.getline(array,'.'); // '.' Is the delimiter.
这行得通吗?
【问题讨论】:
是的:加入 20 世纪 (!) 世纪:
std::string str;
std::getline(std::cin, str, '.');
【讨论】:
会发生什么:
这将编译并运行,但您的分隔符将不起作用,您将获得未定义的行为。此外,当未给出数组大小时,您将失去 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。