欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于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;
}

关于gets()、scanf()、arry[ ]

#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;
}

关于gets()、scanf()、arry[ ]

分析这两段程序及其运行结果可得到一个结论:
  虽然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;
}

运行结果及与数组声明对照如下:
关于gets()、scanf()、arry[ ]

若将s7和s8取消注释,则会报如下错误:
关于gets()、scanf()、arry[ ]
类似于 s8[1e5] 这样的声明也是错误的

相关标签: c语言 缓冲区