有关scanf和cin输入字符的问题, 还有gets()和getline()(总结一下scanf和cin使用时需要注意的事项)

虽然说早知道字符串读入可以有很多坑,但是总是记不住,今天就转载保存一下大佬的吧,需要再来看。

原文地址:https://www.cnblogs.com/qinduanyinghua/articles/5720591.html

今天刷题遇到的问题:定义一个6*5的字符数组,用scanf一个一个的输入字符。

for(int i = 0; i < 6; i++)

    for(int j = 0; j < 5; j++){

        scanf("%c", &a[i][j]);

    }

在界面上可以看到,当输入了5*5时,就结束了,原来回车的换行符也被“吃”了,

同样定义一个一维字符数组,如果用scanf,当输入完之后,如果按回车,换行符也会被“吃”。。。。很容易出现问题。

总结:

(1)

     1.1  scanf 输入字符时,会将'\n'吸收

     1.2  scanf 输入字符串时,遇到空格或者回车就代表结束

            输入一个字符串,如果在这之前有空格或回车,空格和回车不会给字符串。遇到下一个空格或回车才代表结束

     1.3  读一行字符,可以用gets();

(2)

    cin用法很简单,如果输入的是一个字符,那么,'\n'不会被吸收, 其他的情况和scanf差不多

(3)如果用gets()或者getline(),那么它一遇到'\n'就结束,比如定义 char c; char s[10]; scanf("%c", &c);gets(s);printf("%c\n", c);printf("%s",s);

     如果一输入一个字符想给c,然后回车在下一行输入一行字符串给s;那么输出的时候会发现,第一行是字符c,第二行是个空行, 光标在第三行;

分析:输入的第一个字符给了c,然后回车'\n',这个回车代表了s是个空串(很神奇),同时,如果在输入一个字符c之后,按两个空格再加一个字符a再回车,那么s包含的就是两个空格字符加字符a,在结束

    还发现,如果定义 char c[10]; char s[10]; scanf("%s", c);gets(s);printf("%s\n", c);printf("%s",s);

输入asd  SS

结果输出的是

asd

__SS(前面有有两个空格)

表明输入asd加个空格表示c字符串结束时,这个空格同时给了字符串s。。。

(4)如果定义的是字符数组 char c[10],那么读入一行只能用gets(),不能用getline();可以用cout输出字符数组,也可以用printf()输出;

如果定义string s;

输入不能用gets(),只能用getline();

输出不能用printf(),只能用cout;

猜你喜欢

转载自blog.csdn.net/dl962454/article/details/80090854