参考:https://blog.csdn.net/a3192048/article/details/80303547
image.png

一般情况下的输入输出

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. char c;
  4. string s1;
  5. char s2[110];
  6. char g[110][110];
  7. int main(){
  8. // 以字符为例
  9. cin >> c;
  10. cout << c << '\n';
  11. // 读入的数据组数未知的情况下
  12. while (cin >> c){
  13. }
  14. while (scanf("%c", &c) == 1){
  15. }
  16. // 读入string类
  17. cin >> s1;
  18. cout << s1 << '\n';
  19. // 读入字符数组
  20. scanf("%s", s2);
  21. printf("%s\n", s2);
  22. // 读入二维字符数组
  23. int n;
  24. cin >> n;
  25. for (int i = 0; i < n; i++) scanf("%s", g[i]);
  26. for (int i = 0; i < n; i++) printf("%s\n", g[i]);
  27. // int类型 占多少个字符宽度
  28. cin >> n;
  29. printf("%8d %8d\n", n, n);
  30. printf("%-8d %-8d\n", n, n);
  31. // double 类型保留小数点后几位
  32. printf("%.20lf\n", 1.0 / 3);
  33. // 格式化输出的内容,一般建议用printf()搞定,很少用cout
  34. double x = 3.1415926;
  35. cout << x << '\n';
  36. cout << setprecision(5) << x << '\n';
  37. cout << setprecision(4) << x << '\n';
  38. cout << setprecision(3) << x << '\n';
  39. cout << setprecision(2) << x << '\n'; // 3.1
  40. cout << setprecision(1) << x << '\n'; // 3
  41. // setprecision 不计算小数点
  42. // #include <iomanip>
  43. // 与 setw 字段宽度不同的是
  44. // setprecision 的精度设置将保持有效,直到更改为其他值为止
  45. // 流操作符 setw 可用于建立指定宽度的打印区域
  46. // 空格“填充”在前面,所以它被认为是右对齐的
  47. // 左对齐也能搞,麻烦
  48. // 用一回,写一回
  49. int y;
  50. cin >> y;
  51. cout << setw(8) << y << setw(8) << y << '\n';
  52. return 0;
  53. }

输入原理

程序的输入都建有一个缓冲区,即输入缓冲区。每次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据(cin读取数据是从第一个非空白字符开始到下一个空白字符结束)。正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int main(){
  4. string s;
  5. cin >> s;
  6. cout << s << '\n';
  7. cin >> s;
  8. cout << s << '\n';
  9. return 0;
  10. }

image.png
由于cin在遇到空格/tab时,就会停止读取,所以如果我在第一次输入时,利用空格隔开两个字符串,那么cin在第一次取的时候,只会读取前一个字符串,到空格结束,此时缓冲区还保留着前面输入的第二个字符串,那么第二次cin就会直接从缓冲区取残留数据,而不会请求输入。

当然对于以上的情况,也有解决的方案,那就是在第二次调用cin>>str之前通过cin.sync()来清空输入缓冲区。(后面有实验截图

cin >>

根据cin>>sth 中sth的变量类型读取数据,这里变量类型可以为int, float, char, char*, string等诸多类型。这一输入操作,在遇到结束符(Space、Tab、Enter)就结束,且对于结束符,并不保存到变量中。注意:最后一个enter也在缓冲区。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int main(){
  4. string s1, s2;
  5. char c;
  6. cin >> s1 >> s2;
  7. cout << s1 << ' ' << s2 << '\n';
  8. cin.get(c);
  9. cout << (int)c << '\n';
  10. return 0;
  11. }

image.png

cin.get( ) 读入一个字符

其中结束符意味着遇到该符号结束字符串读取,默认为enter,读取的字符个数最多为(长度 - 1),因为最后一个为’\0’。要注意的是,cin.get(字符数组名,接收长度,结束符)操作遇到结束符停止读取,但并不会将结束符从缓冲区丢弃

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int main(){
  4. char c1, c2;
  5. cin.get(c1);
  6. c2 = cin.get();
  7. cout << c1 << ' ' << c2 << '\n';
  8. return 0;
  9. }

image.png

getline(cin, s) 和 cin.getline(s, 110)

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. string s1;
  4. char s2[110];
  5. int main(){
  6. getline(cin, s1);
  7. cin.getline(s2, 110);
  8. //cin.getline第三个参数表示间隔符,默认为换行符’\n’。读入不需要考虑最后的换行符。
  9. cout << s1 << '\n';
  10. printf("%s\n", s2);
  11. return 0;
  12. }

image.png

cin.ignore( )清空整个缓冲区

  1. cin.ignore(1024, '\n');
  2. cin.ignore(); // 用该函数的默认情况,丢弃一个字符,即上次输入结束的回车符

其实该函数最常用的方式是这样的,将第一个参数设的非常大,将第二个参数设为’\n’,这样就可以缓冲区中回车符中的所有残留数据,因为一般情况下前面输入残留的数据是没有用的,所以在进行新一次输入操作前将缓冲区中所有数据清空是比较合理。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int main(){
  4. char c1, c2;
  5. cin >> c1;
  6. cout << c1 << ' ';
  7. cin.ignore();
  8. cin >> c2;
  9. cout << c2 << '\n';
  10. return 0;
  11. }

image.png

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int main(){
  4. char c1, c2;
  5. cin >> c1;
  6. cout << c1 << ' ';
  7. cin.ignore(1024, '\n');
  8. cin >> c2;
  9. cout << c2 << '\n';
  10. return 0;
  11. }

image.png

gets( ) 读入字符串 unsafe

http://c.biancheng.net/cpp/html/260.html
C语言gets()函数:从流中读取字符串

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. char s[110];
  4. int main(){
  5. gets(s);
  6. printf("%s\n", s);
  7. return 0;
  8. }

image.png

getchar( ) 读入一个字符

https://www.runoob.com/cprogramming/c-function-getchar.html
从标准输入 stdin 获取一个字符(一个无符号字符

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. char c;
  4. int main(){
  5. c = getchar();
  6. putchar(c);
  7. puts("");
  8. return 0;
  9. }

image.png

scanf( ) 读入字符数组

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. char s[110];
  4. int main(){
  5. scanf("%s", s);
  6. printf("%s\n", s);
  7. return 0;
  8. }

image.png

getchar( ) 读入字符数组

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. char s[110];
  4. int main(){
  5. int i = 0;
  6. while ((s[i] = getchar()) != '\n') i++;
  7. printf("%s", s); //注意这个地方,我并没有 \n
  8. return 0;
  9. }

image.png

get( ) 读入字符数组

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. char s[110];
  4. int main(){
  5. cin.get(s, 110);
  6. printf("%s\n", s);
  7. return 0;
  8. }

image.png

  1. //多行数据读入的时候
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4. char s[110];
  5. int n = 3;
  6. int main(){
  7. while (n--){
  8. cin.get(s, 110);
  9. getchar(); //把行末的回车读进来,否则翻车
  10. printf("%s\n", s);
  11. }
  12. return 0;
  13. }

image.png

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. char s[110];
  4. int n;
  5. int main(){
  6. cin >> n;
  7. getchar();
  8. while (n--){
  9. cin.get(s, 110);
  10. getchar(); //把行末的回车读进来,否则翻车
  11. printf("%s\n", s);
  12. }
  13. return 0;
  14. }

image.png