浅谈CC++字符串输入scanf、gets、cin、getline、getchar

浅谈CC++字符串输入scanf、gets、cin、getline、getchar,第1张

C/C++的字符串表示方法

测试环境:g++ version 13.1.6 (clang-1316.0.21.2.3)

读取多个字符 cin、scanf: 规则:

输入缓冲区有数据:从输入缓冲区读取,从非空字符开始,遇到空格结束(回车、空格、tab)。末尾回车会被留在输入缓冲区,并且不做处理。
输入缓冲区没有数据:获取键盘输入,当按下回车的时候,输入的数据连同刚按下的回车符被送入输入缓冲区。然后从输入缓冲区区读取数据,规则和上面标黄部分一样。

测试代码
#include 

int main() {
    char str1[12];
    char str2[13];

    scanf("%s", str1);
    scanf("%s", str2);  // 如果缓冲区有数据,那么不会从键盘获取

    printf("str1:%s,str2:%s", str1, str2);  // 最后有个百分号是 *** 作系统的提示符,如果加了换行就没有了

    return 0;
}

输入、输出

➜  code ./a
   str1   str2  # 空格 str1 空格 str2 回车
str1:str1,str2:str2%  # 这里的输出可以看到scanf是跳过了空格,也就是从非空格字符开始空格字符结束                                                                                           
➜  code 

结论:

1、scanf从非空格字符开始读取,空格字符结束(空格、TAB、回车)
2、当缓冲区没有数据的时候,需要先从键盘输入,然后放入缓冲区再读取。
3、当缓冲区有数据的时候不会从键盘获取数据。我们可以从上面输入看到第二个sacnf并没有从键盘获取数据
4、sacnf会把末尾回车留在缓冲区,给以后的输入埋雷

图表描述

gets、geline: 规则

gets:

  • 原型:char* gets( char* str );
  • (deprecated in C++11)
  • (removed in C++14)

getline:

  • 头文件:string
  • getline(cin, str)

输入缓冲区有数据:从输入缓冲区读取,这里的读取会连同空格一起读取,遇到末尾回车结束,回车也会读取并丢弃,所以换行符不会留在输入缓冲区中。
输入缓冲区没有数据:获取键盘输入,当按下回车的时候,输入的数据连同刚按下的回车符被送入输入缓冲区。然后从输入缓冲区区读取数据,规则和上面标黄部分一样。

代码测试
#include 
#include 
#include 

using namespace std;

int main() {
    char ch1[12];
    char ch2[12];
    string str1;

    gets(ch1);
    getline(cin, str1);  // getline用来测试gets会不会留尾行回车
    gets(ch2);  // gets用来测试getline会不会留回车

    cout << "gets1:"<< ch1 << endl;
    cout << "getline:"<< str1 << endl;
    cout << "gets2:"<< ch2 << endl;

    return 0;
}

输入、输出:

➜  code ./a
warning: this program uses gets(), which is unsafe.
 a1 1a  # gets输入:空格a1空格1a回车
 a2 2a。# getline输入:空格a2空格2a回车
 a3 3a  # gets输入:空格a3空格3a回车
gets1: a1 1a
getline: a2 2a
gets2: a3 3a
➜  code 

结论:

1、gets、get line都可以读空格
2、缓冲区的尾行回车都被读取丢弃

图标描述

单字符读取 getchar

输入缓冲区有数据:从输入缓冲区逐字符读取,这里的读取会连同空格一起读取,遇到末尾回车结束,回车也会读取,输出’\n’ ASCII值为10
输入缓冲区没有数据:获取键盘输入,当按下回车的时候,输入的数据连同刚按下的回车符被送入输入缓冲区。然后从输入缓冲区区读取数据,规则和上面标黄部分一样。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/langs/735363.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-04-27
下一篇2022-04-27

发表评论

登录后才能评论

评论列表(0条)

    保存