我们都知道输入字符串的话,用gets()函数与scanf()加%s的话都是可以的。同时,一个字符串的结尾默认有一个\0也是老生常谈。
空格
gets()
1. 当gets()碰到空格时就把它当成一个普通的字符来看,没有任何特殊之处可言。
scanf()
1. 如果再输入过程中间有空格的话,那么它只读取空格前面的字符,碰到空格的话就到此为止了,接下来不再下去了。
2. 就算是最后输入空格,也是一样,反正就是碰到空格的话就停下来不再继续读取,同时这个空格这个字符是不包括在内的。
接下来对于\n与\0,需要知道的是:你手动输入的\0与\n与真正的字符串末尾的\0、按下一个回车键导致往输入缓冲区里面放进去的\n这两者的话是有区别的。对于你手动输入的那些,编译器会把它看成两个字符
\n
1. 我们都知道,当敲一下回车的时候,就相当于输入缓冲区里面放入一个\n.
2. 但是当我们自己在输入中的时候,自己手动输入的一个\n,编译器不会把这个\n当成回车的那个,还是会把它解读成两个字符,这个对于gets与scanf两者相同。
两个注意点:
1. 对于最后输入回车然后放到输入缓冲区里面的那个\n,两者的处理方式就有不同。scanf()是读取那个之前的字符,然后那个\n就仍然留在输入缓冲区里面,这也因此导致可能需要清理输入缓冲区。而gets()会把最后敲进去的那个\n自动给扔出来。
2. 对于scanf输入完之后,如果没有清空缓存区的话,这时候输入缓冲区一个字符就是\n,无论接下来有gets函数还是scanf读取新的内容,首先不可避免的会先读到\n,一旦读到这个“货真价实”的\n,那么就直接回车\换行了。
\0
1. 通过监视也不难发现,当在输入过程中,自己手动输入一个\0,编译器会把它解读成两个字符。
一个注意点:
1. 我们都知道,字符串的末尾默认带有一个\0,但是当从输入缓冲区里面读取字符串的时候,人为的并没有输入\0,但是从上面那么多的监视当中不难发现,编译器会在最屁股后面自动会补上一个\0。