整行读取
- std::getline
string s;
getline(cin, s);
cout << s << endl;
- 利用 scanf 的正则特性
char s[100];
scanf("%[^
]%*c", s);
printf("%s
", s);
- std::gets (deprecated)
char s[100];
gets(s);
printf("%s
", s);
- cin.get (std::basic_istream::get)
char s[100];
cin.get(s,100);
printf("%s
", s);
- cin.getline (std::basic_istream::getline)
char s[100];
cin.getline(s, 100);
printf("%s
", s);
比较常用的自然是方法1,简单省事儿。
比较一下上述方法4和方法5:
cin.get 可以有1个、2个、3个…参数,这里用的是2个参数的形式。
此时它和cin.getline的两个形参是相同格式的:basic_istream& get(char_type* s, streamsize count)
不同点在于:
- 输入字符串不超过指定值时:(包含直接按回车的情况)
get(char*, size) 遇到'
'
停止,但不会从输入流中删去'
'
,这就可能影响后面的读取操作;
getline(char*, size) 也是遇到'
'
停止,但它会从输入流删去'
'
。
2) 输入字符串长度超过指定值:
都是获取size-1个字符,然后加上' '
,总体长度是size。然后get依然不去掉'
'
,而getline也不去掉'
'
,但它会关闭输入流。
其他无需过多了解,此处不表。
refer to: https://blog.csdn.net/yo_bc/article/details/72617275
## 处理以逗号分隔的数据
以逗号分隔的数字(或char):使用cin.get跳过逗号
vector<int> data;
int tmp;
while (cin>>tmp){
data.push_back(tmp);
if (cin.get() == '
') break; // replace break with your code
}
以逗号分隔的字符串:使用getline指定分隔符
vector<string> data;
string tmp;
while (getline(cin,tmp,',')){
data.push_back(tmp);
}
https://blog.csdn.net/weixin_43821376/article/details/100490943
此外还可以:
使用scanf:"%d,"
scanf("%d,", &i); // "%d,": 空格和逗号都可处理,但外层循环要指明循环次数,否则不知道什么时候结束
## scanf和sscanf的简单正则支持
/** 输入语句的简单正则 **/
// sscanf从字符串输入,scanf从stdin输入
// 二者都支持简单的正则: (https://www.cnblogs.com/youthlion/archive/2009/06/21/1507586.html)
string s1 = "notepad=v1.0.0.1001";
char version_info[30];
sscanf(s1.c_str(), "%*[^=]%*c%s", version_info); // v1.0.0.1001,%*c跳过一个字符,即“=v...”的=
cout << version_info << endl;
sscanf(s1.c_str(), "%*[^=]=%s", version_info); // 同上, *是跳过,[]是正则内容,是前闭后开区间
cout << version_info << endl;
char name3[20];
scanf("%*[^.]%s", name3); // 跳过第一个点号之前的内容,把第一个点号和之后的内容保存到name3,没输入点号就不停
cout << "name3: " << name3 << endl;
// cout << "转为string: " << string(name3);