czl666吧 关注:13贴子:261
  • 5回复贴,共1

[C++] 关于string字符串的cin、getline函数输入,以及\0的截断

只看楼主收藏回复

重点是getline函数,首先是使用方法:
std::string input;
std::getline(std::cin, input); // 读取一整行输入


IP属地:四川1楼2024-08-20 22:42回复
    std::getline是POSIX定义的标准库的函数,它与cin的最重要的区别就是:
    它可以读取空格。
    下一楼发实验证明。


    IP属地:四川2楼2024-08-20 22:50
    回复
      代码:
      std::cout << "首先,所有的测试用例都是:\"a sd\\0asd asd\"" << std::endl;
      std::string input;
      std::cout << "以下是用getline的输入" << std::endl;
      std::getline(std::cin, input); // 读取一整行输入
      std::cout << "以下是用getline的输出" << std::endl;
      std::cout << input << std::endl;
      std::string test;
      std::cout << "以下是用cin向string类型变量的输入" << std::endl;
      std::cin >> test;
      std::cout << "以下是用cin向string类型变量的输出" << std::endl;
      std::cout << test << std::endl;
      std::cout << "以下直接写std::string test1(\"a sd\\0asd asd\");的结果,并将test1用cout输出" << std::endl;
      std::string test1("a sd\0asd asd");
      std::cout << test1 << std::endl;
      std::cout << "最后说明一点,打断点证明test1的值确实为\"a sd\",不要认为是cout把结果截断了,正确理解应该是,cin就已经从\"\\0\"截断了" << std::endl;


      IP属地:四川3楼2024-08-20 22:51
      回复
        代码截图以及运行结果截图:



        IP属地:四川4楼2024-08-20 22:53
        收起回复
          由此可见,string的代码赋值与cin赋值亦有差距,如果在代码内赋值,不管是用构造函数的方式,还是用"="符号赋值,都是可以把空格一起识别到变量的值里面。
          比如std::string test1("a sd\0asd asd");
          得到的结果是:test1的值为"a sd"。
          而如果是用cin赋值,那么空格会被识别为截断。
          比如std::cin >> test; //(在程序运行时输入:"a sd\0asd asd")
          std::cout << test << std::endl;
          得到的结果是:test的值为"a"。
          总结:
          1.string有两种赋值方式:代码赋值和cin赋值。
          2.代码赋值有两种方式:用构造函数或者用等号"=",它们的效果相同。
          3.代码赋值可以识别空格,把空格也赋到string类变量中,而cin赋值不行。
          4.代码赋值和cin赋值都会被\0截断。


          IP属地:四川5楼2024-08-20 23:03
          回复