1 standard C I/O
2 头文件:#include <stdio.h>
3
4 1. getchar()
5
6 原型:int getchar(void);
7 功能:从标准输入获取并返回下一个字符,并释放该字符空间。
8 返回值:读取的字符的ASCII,出错或到达文件结尾时返回EOF(-1)。
9
10 键盘 缓冲区 getchar读取字符
11 入水口 蓄水池 出水口
12
13 a. 我们从键盘输入的字符串首先是放在缓冲区内的,再利用getchar()函数从缓冲区内读取字符。
14 b. 当用户键入回车符之后,getchar()才开始从缓冲区中读取字符(一次调用读取一个字符)。
15 c. 键入Enter建实际上产生了2个字符(回车符'\r'和换行符'\n')。回车符'\r'使光标回到行首,换行符'\n'换行。
16
17
18 // 读取含有space(空格),table(制表符)的字符串
19
20 #include <stdio.h>
21
22 int main()
23 {
24 int t;
25 while ('\n' != (c = getchar())) printf("%c", t);
26 return 0;
27 }
28
29 /*
30 * input: 123table456space789
31 * output: 123 456 789
32 */
33
34 // 当使用scanf()和gets()连用时,要使用getchar()清除scanf()输入完成最后键入的Enter键
35
36 #include <stdio.h>
37
38 int main()
39 {
40 int nCase;
41 scanf("%d", &nCase);
42 getchar(); // 清空缓冲区
43 while (nCase--)
44 {
45 char str[10];
46 gets(str);
47 printf("%s\n", str);
48 }
49 return 0;
50 }
51 /*
52 * input:
53 * 2
54 * 123 456
55 * abc def
56 * output:
57 * 123 456
58 * abc def
59 */
60
61
62 2. gets()
63
64 原型:char* gets(char* str);
65 功能:从标准输入读取字符并把他们加载到str里,直到遇到换行或者到达EOF
66 返回值:返回读入的字符串,发生错误时返回NULL
67
68 gets()和scanf()都可以输入字符串,两者的异同:
69 a. 不同点:
70 scanf()不能接受空格、制表符、回车
71 gets()可以接受空格、制表符,遇到回车结束输入
72 b. 相同点:
73 字符串接受结束后自动加'\0'
74
75
76 3. scanf()
77
78 原型:int scanf(const char* format,...);
79 功能:由format指定的格式从标准输入读取,并保存数据到其参数
80 返回值:成功赋值的变量的个数,发生错误时返回EOF
81
82 a. scanf()读取匹配format字符串,当读取到控制字符,它就把值放置到对应变量
83 b. 空白会跳过,非空白字符和输入匹配,然后丢弃
84 c. %符号和控制符间的数,控制指定数量的字符转换到变量中
85 d. scanf()遇到一个字符集(用%[]表示的),那么在括号中的任意字符都会读取到变量中
86
87 scanf("%d %d", &a, &b);
88 如果a和b被成功读入,返回2
89 如果只有a被成功读入,返回1
90 如果a和b都未被成功读入,返回0
91 如果遇到错误或遇到end of file,返回值EOF(-1)
92 只有当第一个参数为NULL时,才可能返回EOF
93
94 可以采用%[^\n]格式控制来输入含有空格,制表符的字符串
95
96 #include <stdio.h>
97
98 int main()
99 {
100 char str[50];
101 scanf("%[^\n]", str);
102 printf("%s\n", str);
103 return 0;
104 }
105 /*
106 * input: 123 456
107 * output: 123 456
108 */
109
110
111 C++输入含有空格制表符的字符串
112
113 对于字符数组
114
115 1. getline()
116
117 有两种重载,只介绍一种
118 原型:istream& getline(char* buffer, streamsize num);
119 功能:读取字符到buffer中,直到发生以下情况:
120 a. num - 1个字符已经读入
121 b. 碰到换行符
122 c. 碰到EOF
123 d. 碰到字符delim(delim字符不会被放入buffer中)
124 返回值:如果getline()没有读入字符,将返回false,可用于判断文件是否结束。
125
126 调用方法:cin.getline(str, len);
127 args1: 用来存储输入数据 args2: 要读取的字符数
128
129 #include <iostream>
130 using namespace std;
131
132 int main()
133 {
134 char str[30];
135 cin.getline(str, 30);
136 cout << str << endl;
137 return 0;
138 }
139 /*
140 * input: 123 456
141 * output: 123 456
142 */
143
144
145 2. get()
146
147 有多种重载,只介绍一种
148 原型:istream& get(char* buffer, streamsize num);
149 功能:读取字符到buffer直到num - 1个字符被读入, 或者碰到EOF或换行标志
150 返回值:发生错误时返回false,可用于判断是否正常输入
151
152 调用方法:cin.get(str, len);
153
154 #include <iostream>
155 using namespace std;
156
157 int main()
158 {
159 char str[30];
160 cin.get(str, 30);
161 cout << str << endl;
162 return 0;
163 }
164 /*
165 * input: abc def
166 * output: abc def
167 */
168
169 getline()和get()的区别
170
171 两者都读取一行输入,直至换行符。
172 然后,getline将丢弃换行符,而get()将换行符保留在输入序列里。
173 所以,再使用cin.get()输入多行数据时,中间可以使用get()消除换行符。
174
175 #include <iostream>
176 using namespace std;
177
178 int main()
179 {
180 char str1[30], str2[30];
181 cin.get(str1, 30);
182 cin.get();
183 cin.get(str2, 30);
184 cout << "str1: " << str1 << endl;
185 cout << "str2: " << str2 << endl;
186 return 0;
187 }
188 /*
189 * input: abc def
190 * 123 456
191 * output: str1: abc def
192 * str2: 123 456
193 */
194
195
196 对string类
197
198 调用方法:getline(cin, str);
199
200 #include <iostream>
201 #include <string>
202 using namespace std;
203
204 int main()
205 {
206 string str;
207 getline(cin, str);
208 cout << str << endl;
209 return 0;
210 }
211 /*
212 * input: 123 456 789
213 * output: 123 456 789
214 */