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