输入流是就是一串连续的字符,比如我们输入一个回车, 三个空格,然后再输入数字12,接着再输入字母a,空格,bc,然后再回车,再输入3,空格,4def,那么该输入流实际上就是这样的一个字符串: ‘\n’_ _ _12a _ bc'\n'3 _ 4def, 其中'\n'表示字符换行,下划线表示字符空格。 当我们要从输入流中读取某特定类型的数据时,就从输入流的首字符开始读,直到读到不属于于该类型的字符或结束字符。
假设输入流就是上述的字符串
int Int;
char c;
char c_arr[10];
string str;
cin >> Int | 从首字符开始读,丢弃所有的空白字符,直到读到数字字符,然后遇到非数字字符结束。 这里首字符就是换行符,丢弃换行符和3个空格,然后读取数字字符,遇到非数字字符a结束, 然后把12转换成整数赋给Int,此时输入流首字符指向 a |
cin >> c | 从输入流中读取第一个非空字符,这里读取的就是1 |
cin >> c_arr | 从首字符开始读,丢弃遇到非空字符前的所有空白字符(首字符是换行也同样丢掉),遇到非空字符后的第一个空白字符结束读取, 不丢弃读取结束时的空白字符。这里c_arr从输入流中读取后就变成12a,首字符指向a后面的空格 |
cin >> str | 同 cin >> c_arr |
读取一个字符
cin >> c | |
cin.get(c) | 读取字符,空白字符也是有效的,返回cin,遇到EOF返回false |
c = cin.get() | 读取字符,空白字符也有效,返回字符的整数值,遇EOF返回EOF |
读取一个字符串
char* gets(char* ptr) | 从输入流中抽取字符,直到遇到换行符,并扔掉换行符。如果输入流首字符就是换行符,则直接结束并丢弃这个换行符 该函数在<cstdio>头文件中 |
cin.get(char* ptr, int n, char = '\n') | 从首字符开始读取,不忽略空白字符,读取n个字符结束,如果没读完n个就遇到结束字符,不丢弃结束字符,结束 |
cin.getline(char* ptr, int n, char = '\n') | 从首字符开始读取,不忽略空白字符,读取n个字符结束。如果没读完n个就遇到结束字符,丢弃结束字符,结束 |
cin.ignore(int n, char = EOF) | 从首字符开始,丢弃n个字符,包括空白字符。如果没丢掉n个就遇到结束字符,丢弃结束字符,结束 |
有三个函数会丢弃结束字符:gets(char*), getline(char* , int, char), ignore(int, char)
C语言
scanf("%c", &ch); // 读取第一个字符,就算是空白字符
scanf("%s", ch_arr); // 忽略前面的空白字符,从第一个非空字符开始读,遇到空白字符结束,不丢弃空白字符
int getchar(); // 读取输入流中的第一个字符,空白字符也有效,返回该字符的ASCII值
gets(char*); // 同上面C++中的总结
--------------------------------------------------------总结方式2------------------------------------------------------------------------
istream
cin >> ch | 读取第一个非空字符 |
ch = cin.get() | 读取第一个字符,非空也有效,返回字符对应的整数值,遇EOF返回EOF |
cin.get(ch) | 读取第一个字符,非空也有效,返回cin,遇EOF返回false |
cin.get(char* buffer, int n, char = '\n') | 从首字符开始读取,不忽略空白字符,读取n个字符结束,如果没读完n个就遇到结束字符,不丢弃结束字符,结束 |
cin.getline(char* buffer, int n, char = '\n') | 从首字符开始读取,不忽略空白字符,读取n个字符结束。如果没读完n个就遇到结束字符,丢弃结束字符,结束 |
cin.ignore(int n, char = EOF) | 从首字符开始,丢弃n个字符,包括空白字符。如果没丢掉n个就遇到结束字符,丢弃结束字符,结束 |
cstdio
scanf("%c", &ch) | 读取第一个字符,就算是空白字符 |
scanf("%s", ch_arr) | 忽略前面的空白字符,从第一个非空字符开始读,遇到空白字符结束,不丢弃空白字符 |
int getchar() | 读取输入流中的第一个字符,空白字符也有效,返回该字符的ASCII值 |