C++如何输入多行字符串(含空格)
2014-07-10 18:58
477 查看
我们要实现这样的功能:
输入一个整数n,表示接下来要输入n行字符串,每一行字符串带有空格,按回车表示结束该行的输入
程序1:
程序2:
程序2可以实现读入带空格的整行字符串,但只输入一行就结束了
细心的读者可以发现,在输入的数字下边出现空行
这是因为输入数字之后,敲回车,产生的换行符仍然滞留在输入流了,接着就被getline(cin,s)给读进去了,
此时的s=“\n”,所以在2的后边会有一个空行
同时for循环中的i也自增1,所以会少读一行
要解决这个问题,就要干掉滞留在输入流中的换行符
程序3:
可以用getchar()代替cin.ignore()
getchar()读取输入流中的一个字符,所属头文件#include<cstdio>
还可以将
string s;
getline(cin,s);
换为:
char ch[256];
gets(ch);
我们不能用scanf("%s")输入字符串,因为它碰到空格或者TAB就会停下来,可以用下述两种方法解决这个问题:
第一种:
fgetc(fin),读取一个打开的文件fin,读取一个字符,然后返回一个int值
为什么返回的是int而不是char呢?
因为如果文件结束,fgetc将返回一个特殊标记EOF,它并不是一个char
如果把fgetc(fin)的返回值强制转换为char,将无法把特殊的EOF和普通字符区分开
如果要从标准输入读取一个字符,可以用getchar(),它等价于fgetc(stdin)
fgetc和getchar()将读取“下一个字符”,因此你需要知道在各种情况下,“下一个”字符是那个
如果用scanf("%d",&n)读取整数n,则要是在输入123后多加了一个空格,用getchar()读取的将是这个空格
如果在123后换行,则读取到的将是回车符“\n”
第二种:
fgets(buf,MAXN,fin)读取完整的一行放在字符数组buf中,其中buf的声明为buf[MAXN]
这个函数读取不超过MAXN-1个字符,然后在末尾添上结束符‘\n’,因此不会出现越界的情况
之所以说可以用这个函数读取完整的一行,是因为一旦读到回车符‘\n’,读取工作将会停止,而这个‘\n’也会是buf字符串中最后一个有效字符(再往后就是字符串结束符‘\0’了)
输入一个整数n,表示接下来要输入n行字符串,每一行字符串带有空格,按回车表示结束该行的输入
程序1:
#include <iostream> #include <string> using namespace std; int main() { string s; int n; cin>>n; for(int i=0;i<n;i++) { cin>>s; cout<<s<<endl; } return 0; }cin>>s不能接受空格输入
程序2:
#include <iostream> #include <string> using namespace std; int main() { string s; int n; cin>>n; for(int i=0;i<n;i++) { getline(cin,s); cout<<s<<endl; } return 0; }
程序2可以实现读入带空格的整行字符串,但只输入一行就结束了
细心的读者可以发现,在输入的数字下边出现空行
这是因为输入数字之后,敲回车,产生的换行符仍然滞留在输入流了,接着就被getline(cin,s)给读进去了,
此时的s=“\n”,所以在2的后边会有一个空行
同时for循环中的i也自增1,所以会少读一行
要解决这个问题,就要干掉滞留在输入流中的换行符
程序3:
#include <iostream> #include <string> using namespace std; int main() { string s; int n; cin>>n; cin.ignore(); for(int i=0;i<n;i++) { getline(cin,s); cout<<s<<endl; } return 0; }这下就可以了
可以用getchar()代替cin.ignore()
getchar()读取输入流中的一个字符,所属头文件#include<cstdio>
还可以将
string s;
getline(cin,s);
换为:
char ch[256];
gets(ch);
我们不能用scanf("%s")输入字符串,因为它碰到空格或者TAB就会停下来,可以用下述两种方法解决这个问题:
第一种:
fgetc(fin),读取一个打开的文件fin,读取一个字符,然后返回一个int值
为什么返回的是int而不是char呢?
因为如果文件结束,fgetc将返回一个特殊标记EOF,它并不是一个char
如果把fgetc(fin)的返回值强制转换为char,将无法把特殊的EOF和普通字符区分开
如果要从标准输入读取一个字符,可以用getchar(),它等价于fgetc(stdin)
fgetc和getchar()将读取“下一个字符”,因此你需要知道在各种情况下,“下一个”字符是那个
如果用scanf("%d",&n)读取整数n,则要是在输入123后多加了一个空格,用getchar()读取的将是这个空格
如果在123后换行,则读取到的将是回车符“\n”
第二种:
fgets(buf,MAXN,fin)读取完整的一行放在字符数组buf中,其中buf的声明为buf[MAXN]
这个函数读取不超过MAXN-1个字符,然后在末尾添上结束符‘\n’,因此不会出现越界的情况
之所以说可以用这个函数读取完整的一行,是因为一旦读到回车符‘\n’,读取工作将会停止,而这个‘\n’也会是buf字符串中最后一个有效字符(再往后就是字符串结束符‘\0’了)
相关文章推荐
- C++如何连续输入多个可能含空格的字符串
- 编写C/C++程序时如何输入带空格的字符串
- 在C++中如何输入带空格的字符串
- C++如何输入含空格的字符串
- C/C++如何输入包含空格的字符串
- C++如何输入含有空格字符的字符串
- 如何往char数组里输入带空格的字符串
- 如何从一行输入的字符串中基于空格切割出单词
- c++解析输入带空格的字符串
- C++连续输入带空格的字符串
- C++中利用文件输入对象(即ifstream对象)来读取文本文件中带空格的字符串以及混合输入数字与字符串
- C++中如何接收输入的字符串
- 如何c++去除string字符串首尾的\n,\r,\t,空格?
- C++输入带空格的字符串
- C++中cin如何输入字符串
- C++:输入带有空格的字符串,回车结束输入
- C/C++中输入带空格的字符串用法总结
- [转]关于在C++中输入带空格的字符串的方法
- string不能输入空格,如何输入有空格字符串呢
- C++ && C 带空格的字符串输入