C/C++的几个输入流

355 阅读3分钟

C

1.scanf( )

存在于
<stdio.h>
C++
<cstdio>
)中,根据
stdin
读取数据并根据参数格式进行赋值,以第一个非空格字符(空格字符如:空格,制符表,换行符)为起点。一般键盘输入时,返回成功赋值的参数的个数如:
0(
失败
),1(
成功赋值一个
),2
...

开始
&
结束标志
:
常见的数值赋值、单个字符赋值时,以第一个非空格字符为开始标志,以空格字符为结束标志。但是以换行符为键盘缓冲区结束标志(整数、字符、字符串都会出现下图情况)。所以使用
"%s"
进行字符串赋值时,无法赋值空格字符。


                  附,格式说明:

常见的格式化单元符
[td]

i

整数

d/u

十进制整数(

u
是无符号数)

o

八进制整数

x

十六进制整数

f

浮点数(似乎是所有进制的,如

16
进制浮点数前面加
'0x'

e

e

指数形式的浮点数

g

g

自动选择合适的类型

c

字符

s

字符串

p

指针地址

常见的几种
格式
&
类型
[td]

%hd

%hu

short int

unsigned short int

%d

%u

int

unsigned int

%ld

%lu

long int

unsigned long int

%lld

%llu

long long int

unsigned long long int

%f

float

%lf

double

%Lf

long double

%c

char

%s

char * / char[ ]

2.getchar( )

存在于
<stdio.h>
中,返回读取的字符的
ASCII
码,返回类型为
int
。(一个字符一个字符地读取)

一般情况下
getchar( )
会开启输入
(
如:键盘
)
缓冲区,并且该缓冲区以换行符为结束。但是此时
getchar( )
只读取了一个字符,导致换行符还存在于缓冲区内。

第一次输入
“A”+“
回车
//
可以明显地看到
b=“
回车

第二次输入
“YYY”+“
回车

第三次输入
“EEE”+“
回车

综上,无
delim
,不丢弃任何字符,一次读一个字符,包括空格符、制表符、换行符。

如图:(第
16
while
的条件用来去除缓冲区中的
换行符


3.gets(char * str)

存在于
<stdio.h>
,
原型为
char * gets ( char * str )
,返回
str

以换行符为结束标志,将所有字符
(
包括空格
)
赋值给字符数组
,
并丢弃
delim

目前来看只能进行
字符数组
的赋值,如图


C++:4.std::getline(istream& is, string& str, char delim)

原型:

istream& getline (istream& is, string& str, char delim);

istream& getline (istream&& is, string& str, char delim);

istream& getline (istream& is, string& str);

istream& getline (istream&& is, string& str);

存在于
<string>
中,可以认为是
gets( )
string
版,返回
str
,并丢弃
delim

输入流必须指定,默认情况下终结符为
换行符
“\n”
)。


5.std::istream::getline(char* s, streamsize n, char delim)

存在于
<istream> <iostream>
中,可以认为是
gets( )
,返回
istream
该对象的指针,并丢弃
delim

原型:

istream& getline (char* s, streamsize n );

istream& getline (char* s, streamsize n, char delim );

6.std::istream::get()

存在于
<istream> <iostream>
中,可以认为是
gets( )
,因为重载函数比较多。返回
istream
该对象的指针,不丢弃
delim

原型

int get();

istream& get (char& c);

istream& get (char* s, streamsize n);

istream& get (char* s, streamsize n, char delim);

istream& get (streambuf& sb);

istream& get (streambuf& sb, char delim);