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

关于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] 这样的声明也是错误的

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值