手记

C++中cin对象读取字符串的注意事项

cin是istream包的对象, 用来读取数据. 初期刚用时因为细节很多, 所以频频出错, 有了点时间总结一下.

cin >> xx_1 的注意点

  • 这种形式时, cin以空格/制表符(tab)/回车(enter/return)来判断是否要结束读取
  • cin会自动忽略输入流中的空格/制表符(tab)/回车(enter/return), 以保证正常输入, 见下面的Demo解释
// ... 默认包含了iostream , std空间等细节
char xx_1[20], xx_2[20];
cin >> xx_1[20];
cin >> xx_2[20];

// 运行程序 键盘输入 test [N个空格/制表符/换行符] test
// 此时可以正常的给xx_1和xx_2赋值为test, 那N个空格/制表符/换行符会被忽略

cin.getline(xx_1, number) / cin.get(xx_1, number) 的注意点

  • 都是接受输入流的一整行, 结束读取的条件是遇到换行符or输入流的字符大于第二个参数了.
  • 遇到换行符中止读取后, 第一种将换行符从输入流中删掉.
  • 遇到换行符中止读取后, 第二种将换行符保留在输入流中.
  • 不会像cin>>那样自动忽略, 输入流有什么就读取什么
  • 最多读取number-1个字符, 第number个位置将用来设为'\0'
// ... 默认包含了iostream , std空间等细节
char xx_1[20], xx_2[20];
cin.getline(xx_1, 20);
cin.getline(xx_2, 20);

//  运行程序, 输入test  test [换行符] test
//  会正确的将xx_1设置为test test, 将xx_2设置为test

char xx_3[20], xx_4[20];
cin.get(xx_3, 20);
cin.get(xx_4, 20);

//  运行程序, 输入test  test [换行符] test
// 出现问题了, xx_3会被正确的设置为test test, 而xx_4会被设置为[换行符]
// 这是由于cin.get()不会自动删掉输入流的换行符. 可以连缀一个get()来避免
cin.get(xx_3, 20).get();

混合使用cin >> xx 与cin.get[line](xx, number) 注意点

  • 要特别小心对换行符的处理
  • 两者对于中止读取的标识符不同
// ... 默认包含了iostream , std空间等细节
char xx_1[20], xx_2[20];
cin >> xx_1;
cin.getline(xx_2, 20);

// 运行程序, 输入 test_0[空格]test_1[换行符] test_2
// xx_1将被赋值为test_0, xx_2将被赋值为[空格]test
// 这是因为cin>>遇到空格就中止读取了, 而cin.getline也不会忽略空格, 有什么就读取什么导致的

char xx_3[20], xx_4[20];
cin.getline(xx_3, 20);
cin >> xx_4;

// 运行程序, 输入 test_0[空格]test_1[换行符] test_2
// 这次会按照意愿, xx_3被赋值为test_0[空格]test_1, xx_4被赋值为test_2

char xx_5[20], xx_6[20];
cin.get(xx_5, 20);
cin.getline(xx_6, 20)

// 运行程序, 输入 test_0[空格]test_1[换行符] test_2
// 因为get不会删掉输入流的换行符, 所以xx_6将读取换行符, 而非test_2
4人推荐
随时随地看视频
慕课网APP