C/C++中字符串的输入问题

  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  */

 

posted @ 2015-06-14 13:41  jasaiq  阅读(862)  评论(0编辑  收藏  举报