C语言的数组输入(多余数据清除)

问题:

刚接触C语言的同学们在刷题的过程中经常会遇到数据的输入,不过大部分输入格式类似于这种

是不是非常的整齐,如果是这个样子则皆大欢喜,可是总会有例外,比如这种。

在这个题目中我们读取数据的时候不仅要读取输入数据中的数字,还要抛弃“[”,“]”,“,”这三个字符,当然,我们首先要使用fgets()函数来读取这一段数据,后进行遍历,但是遍历的过程中当心两位以上整数的出现,例如“27”会被拆分成‘2’和‘7’,这是我们不愿看到的,可是大家可以想到,27 == 2*10+7,271 == 2*10*10+7*10+1。没错,大家应该都能想到循环,而方括号和英文逗号都可以使用Ascii码来解决。具体代码如下所示。

具体代码:

  #include<stdio.h>
int main(void)
{
    int i = 1; //当str字符串从下标1开始读取则可以避开‘[’,切i在后面只为str的下标。
    char str[101];//定义字符数组,来接受输入数据。
    int arr[100] = { 0 };//接受str中的数字,先将整数数组内容全部初始化为0,具体解释看后面。

​​​​​​​
    fgets(str, 100, stdin);


    int k = 0;//k为arr的专属下标,从下标0开始接受整数。
    for (int i = 1; str[i] != 93; i++)//93为‘]’的AScii码
    {
        if (str[i] == ',')
            k++;//当在str中读取到‘ , ’,时意味着一段数字字符串读取完毕,一个数字已经接收成功。
        else
            arr[k] = arr[k] * 10 + (str[i] - '0');//后面解释
    }
    for (int j = 0; j <= k; j++)
        printf("%d ", arr[j]);//输出验证
}

可能的疑问:

        或许大家存在某些问题,下面我来解答,当然仅从小白的角度来想可能存在的问题。

1,93,44能不能读取接收?

有的同学可能会疑惑,既然循环判断条件使用的是Ascii码,那么44,93等类似的数字是不是就读取不到。实际上这是不会的,例如“93”是字符串,而循环读取的是字符型数据,顺序为‘9’,‘3’.

2, arr为什么要全部初始化为0?

大家可以想一下如果没有初始化为0,arr[k] = arr[k] * 10 + (str[i] - '0');会怎么运行,顺便说一下这句代码的意思,假设arr数组全部已经初始为0,k为0,

而i初始化为1,str[i]一开始读取的一定介于'0'~'9'之间,所以(str[1]-'0')便为第一个整数,arr[0]*10开始一定为0。

如果数据为[1,2,3,4,5]则目前结果arr[0] = 1;

循环继续发现str[2] == ','则 k+=1。

如果数据为[93,2,3,4,5]则目前结果arr[0] = 9;

继续循环发现str[2] = 3,则k不变 arr[0] = arr[0]*10+(str[2]-'0');

结果arr[0] = 91,

以此类推。

当然这段代码也不是一定没有问题,个人表述能力有限,大家可以积极交流讨论。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值