字符串的读入注意事项
众所周知,字符串的读入方式有很多种,但是不同读入方式拼起来的时候总是会产生一些奇奇怪怪的问题。
getchar()
:读入一个字符,啥都能读,包括 空格 和 回车。
cin
:读入一个字符串,不读空格。遇到空格和回车停止但是不读入空格和回车!但会忽略上次读入剩下的回车!
scanf("%s", s)
:读入一个字符串,不读空格。遇到空格和回车停止但是不读入空格和回车!但会忽略上次读入剩下的回车!
gets(s)
(C++14 好像不能用了):读入一行字符串,读入空格。遇到回车停止但是不读入回车。如果上次使用 gets 读入,会忽略上次读入剩下的回车,否则不会忽略!(解决方法是在上次读入后面加一个 getchar()
把回车读掉)
scanf("%[^'\n']", s)
:读入一行字符串,注意事项同 gets(s)
,但是不管上次使用什么东西读入,如果有回车,这次读入依旧会先读入回车。(\n
两侧的单引号加不加无所谓)
getline(cin, s)
(C++14 好像不能用了):读入一行字符串,字符串 s
的类型必须是 string
类。具体注意事项同 gets(s)
,但是它没有 scanf("%[^'\n']", s)
这个方法的问题。
注:上面提到的 上次读入
同样包括读入整数,字符串等一系列情况,但是不包括使用快读读入。
快读的写法有很多种,至少我的快读可以把末尾的回车读掉。
读到但不读入
:指本次读入了这个字符,但是下次开始读的时候依旧会读入它。
如果有补充或者纠错欢迎提出