关于gets()、scanf()、arry[ ]
程序员文章站
2022-05-09 21:23:41
...
关于gets()、scanf()、arry[ ]
刚刚在写一个数据结构的程序的时候,发现了一些小知识
gets()和scanf(“%s”,…)的区别
1、 scanf(“%s”,…)遇到回车、空格、制表符都会结束输入;
gets()只遇到回车结束
2、 scanf(“%s”,…)会将回车、空格、制表符留在缓冲区
gets()不会将回车留在缓冲区
——————————————————————————
3、 这是本人觉得最奇妙的一点
先看以下两段程序:
#include <stdio.h>
#include <stdlib.h>
#define N 3
int main(void)
{
int i;
int num;
char ch[N][10];
for(i = 0; i < N; i++){
printf("请输入一个整数:\n");
scanf("%d",&num);
printf("请输入第%d个字符串:\n", i+1);
scanf("%s",ch[i]);
}
printf("\n");
for(i = 0; i < N; i++){
printf("第%d个字符串为:\n", i+1);
puts(ch[i]);
}
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#define N 3
int main(void)
{
int i;
int num;
char ch[N][10];
for(i = 0; i < N; i++){
printf("请输入一个整数:\n");
scanf("%d",&num);
printf("请输入第%d个字符串:\n", i+1);
gets(ch[i]);
}
printf("\n");
for(i = 0; i < N; i++){
printf("第%d个字符串为:\n", i+1);
puts(ch[i]);
}
return 0;
}
分析这两段程序及其运行结果可得到一个结论:
虽然scanf(“%s”,…)会将回车留在缓冲区,但同时会忽略第一个字符即为回车的情况;gets()不会将回车留在缓冲区,同时也会因第一个字符为回车而结束输入。
数组大小的声明方式
突然发现用1eX的方式也无法声明数组的大小
#include <stdio.h>
#include <stdlib.h>
#define N 100
int main(void)
{
int s1[100]; //正确声明方式
int s2[N];
int s3[N*N];
int s4[100*5];
int s5[100/10];
int s6[10+20];
//int s7[10.2]; //错误声明方式
//int s8[1e5];
printf("int: %d\n",sizeof(int));
printf("s1: %d\n", sizeof(s1));
printf("s2: %d\n", sizeof(s2));
printf("s3: %d\n", sizeof(s3));
printf("s4: %d\n", sizeof(s4));
printf("s5: %d\n", sizeof(s5));
printf("s6: %d\n", sizeof(s6));
//printf("s7: %d\n", sizeof(s7));
//printf("s8: %d\n", sizeof(s8));
return 0;
}
运行结果及与数组声明对照如下:
若将s7和s8取消注释,则会报如下错误:
类似于 s8[1e5] 这样的声明也是错误的
上一篇: JAVA中的各种Buffer
下一篇: 缓冲区溢出攻击
推荐阅读
-
gets() 与 scanf() 的小尴尬
-
C语言——常用标准输入输出函数 scanf(), printf(), gets(), puts(), getchar(), putchar(); 字符串拷贝函数 strcpy(), strncpy(), strchr(), strstr()函数用法特点
-
C语言的中gets(s)和scanf("%s",s)的区别
-
C中gets()函数与scanf()函数说明
-
C语言 gets()和scanf()函数的区别
-
浅谈C语言中scanf(),gets(),getchar()函数区别与联系
-
浅谈C语言中scanf(),gets()函数区别与联系
-
C语言的中gets(s)和scanf("%s",s)的区别
-
gets() 与 scanf() 的小尴尬
-
C中gets()函数与scanf()函数说明