天天看点

关于gets()函数和scanf()函数的区别

         gets()函数和scanf()函数都是编写程序非常常用的函数,正因为它的常用,一些程序编写人员往往忽略了其两者的一些区别,这就造成了有时候程序运行错误,但是怎么也找不到原因的现象,今天我们就看看它们究竟有什么区别!

1.

非常明显的一点:gets()只能输入字符串,scanf()功能相对就比较多了,只要有相应的格式控制符,如%d,%c,%lf......,就可以输入整型,字符型,浮点型等数据。

2.

         scanf()结束字符串的输入可以用回车,空格,制表(tab 相当于好几个空格)键,而gets()只能用回车键,这也说明了scanf()函数不能输入空格,gets()则可以。看如下代码和运行结果:

#include<stdio.h>

#include<string.h>

int main(void)

{

char a[100],b[100];

printf("gets()输入:\n");

gets(a);

printf("scanf()输入:\n");

scanf("%s",b);

printf("%d\n%d\n",strlen(a),strlen(b));

return 0;

}

关于gets()函数和scanf()函数的区别

可明显看出gets()包含空格,而scanf()则到空格结束。

3.

         gets()函数可接收回车之前的所有字符,并把‘\0’替换为‘\n’,不会在缓冲区留下东西,而scanf()则是在输入有效字符后在结尾加一个'\0',而输入的结束标志(回车,空格,制表)会留在缓冲区中,也可以这样理解,对于gets()来说,最后输入的“\n”会变成‘\0’,而scanf()当输入结束标志时,是把结束标志存到缓冲区中,然后再字符串后面加一个'\0'。看如下程序和运行结果:

#include<stdio.h>

#include<string.h>

int main(void)

{

char a[100],b[100];

printf("scanf()输入:\n");

scanf("%s",a);

    printf("gets()输入:\n");

gets(b);

printf("%d\n%d\n",strlen(a),strlen(b));

return 0;

}

关于gets()函数和scanf()函数的区别

为什么是3和4呢???

        因为scanf()是以空格结束的,并且结束后的字符要存到缓冲区中,所以abc是scanf()中的有效字符3个,后面的字符'空格'+def+'回车'(注意,后面还有一个回车键)则存到了缓冲区中,共5个字符,接下来又用gets()输入,把缓冲区里的东西‘空格’+abc+‘回车’输入到了gets()中,当遇到回车的时候‘\n’变为‘\0’作为结束标志,所以最后输出4。所以以后使用这两个函数的时候,尤其是混合使用的时候要注意这种情况的发生。

        最后,还有一个相同点,其实已经说过了,就是当输入完成的时候,数组中的最后一个字符都是'\0',因此有时候用到循环的时候,没必要先用strlen()求字符的个数,而是直接用数组名[下标]!=‘\0’作为条件。

继续阅读