问题:
刚接触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,
以此类推。
当然这段代码也不是一定没有问题,个人表述能力有限,大家可以积极交流讨论。