gets()函数和scanf()对比
先看代码:
#include<stdio.h>
int main(void){
char a1[10], a2[10],a3[10];
scanf( "%s%s",a1,a2);
//gets(a2);
gets(a3);
puts(a1);
puts(a2);
puts(a3);
// printf("%s\n",ch1);
// printf("%s",ch2);
printf("end...");
return 0;
}
再看一段代码:
#include<stdio.h>
int main(void){
char a1[10], a2[10],a3[10];
scanf( "%s",a1);
gets(a2);
gets(a3);
puts(a1);
puts(a2);
puts(a3);
// printf("%s\n",ch1);
// printf("%s",ch2);
printf("end...");
return 0;
}
a. 可以看到a1中放的是joncy, scanf是用空格来结束的。 从结果中来看, scanf在读完之后空格还在缓冲区中。 而gets是接收空格的,所以第二张图中输出的 a2 前有空格存在。
b. 从第一张图中, 还可以看出scanf也不识别回车, 同样也把回车留在了缓存区中。 而gets是接收回车的, 所以第一张图中的 a3 输出的是回车。
看代码:
#include<stdio.h>
int main(void){
char a1[10],a2[10],a3[10],a4[10];
gets(a1);
gets(a2);
gets(a3);
gets(a4);
puts(a1);
puts(a2);
puts(a3);
puts(a4);
printf("end...")
return 0;
}
c. 这个图可以看到,gets函数能够接收字符串, 而且不把回车符号留在缓存区中。
#include<stdio.h>
int main(void){
char a1[10];
gets(a1);
char c = getchar();
puts(a1);
printf("%c\n",c);
printf("end...");
return 0;
}
#include<stdio.h>
int main(void){
char a1[10],a2[10];
gets(a1);
char c = getchar();
puts(a1);
printf("%c\n",c);
scanf("%s",a2);
char c2 = getchar();
puts(a2);
printf("%c",c2);
printf("end...");
return 0;
}
d. 要注意这里puts自己把回车符吸收了,所以要等待输入。但是scanf没有,所以c2是换行符。
注:gets函数把字符串输出到标准输出设备,将’\0’转换为回车换行。但是scanf不会,末尾还是’\0’,且空格,换行或者tab都会留在缓存区。
这是一段百度词条的代码:
> #include <stdio.h>
> #include <conio.h> int main(void) {
> int i;
> char string[20];
> for(i=0;i<10;i++)
> string[i]='a';
> puts(string);
> getch();
> return 0; }
这是运行结果:
确实我们看到, gets看不到 ‘\0’ 是不会结束的。
#include <stdio.h>
#include <conio.h>
/*
字符串的末尾\0不会输出如果在%c的情况下
gets()把换行符吸收转换成\0
*/
int main(void) {
int i;
char string[10];
// for(i=0;i<10;i++)
// string[i]='a';
gets(string);
for(i=0;i<10;i++)
printf("%d",string[i]);
// getch();
return 0;
}
编程中遇到的问题:
scanf("%s,%s",a1,a2); 千万不要这样写,字符串输入最好分开写,或者把逗号去掉。
本文引用百度词条:https://baike.baidu.com/item/puts/4747927?fr=aladdin
更多干货文章,编程资源,请关注公众号『Carry互联网笔记』