cin和getline的读取
1、`cin`:
用于读取不包含空格的字符串。例如:
string word;
cin >> word;
这只会读取空格前的字符串部分。
2、`getline`:
用于读取整行,包括其中的空格。例如:
string line;
getline(cin, line);
这会读取直到遇到换行符的整行字符串。
3、其他关于字符串输入的注意事项
①关于cin.ignore()的用处
如果先使用cin读取了一个或多个值,然后紧接着想使用getline读取一行,可能会意外地发现getline直接跳过了,没有读取任何内容。
这是因为cin在读取完之后会留下一个换行符在输入缓冲区,getline会立即读取这个换行符并认为输入结束。为了解决这个问题,可以使用cin.ignore()来清除换行符。
②关于 \r\n 、 \n
历史背景:回车和换行有不同之处。
在打字机上,
"回车"(\r)意味着移动打印头到行首,
"换行"(\n)意味着向下移动纸张一行,但打印头位置不变。
由于这两个动作在打字机上是分开的,所以它们在计算机编码中也被区分开来。
技术实现:
Unix/Linux:在这些系统上,只使用\n来表示新的一行。所以,当你在Unix或Linux系统上按“Enter”键时,实际上是输入了\n字符。
Windows:在Windows系统上,新的一行使用\r\n来表示。也就是说,\r将光标移动到行首,然后\n将光标移动到下一行。
现代问题:
特别是从文件或其他来源读取字符串时,由于
Unix/Linux:使用\n作为行结束符。
Windows:使用\r\n作为行结束符。
这些差异在以下情境中可能会导致问题:
跨平台文件读取:如果你在Windows系统上创建了一个文本文件,然后在Linux系统上读取,可能会意外地在行尾看到\r字符。
使用getline读取:getline默认使用\n作为分隔符,但如果你读取一个含有\r\n的文件(如Windows格式的文件),getline可能会将\r作为字符串的一部分读取进来。