C语言给我们提供了丰富的输入输出方法,但是当我们需要读取多行由空格和空行分割的数据,并且每行数据的数量不确定时,貌似没有直接可以用的方法。
例如,将以下数据读入一个二维数组:
4
0 -2 -7 0 9 2 -6 2
-4 1 -4 1 -1
8 0 -2
第一行是二维数组的维数,接下来的四行是按行的输入数据,其中包含一个空行,我们需要将这些数据读入到一个二维数组中,直接使用scanf,fscanf,sscanf都不行,下面采用的方法是fgets读取每行,然后再逐个数据解析的方法:
atoi方法还有好多没有考虑的地方,不过在一般的读取应该是够用了。
例如,将以下数据读入一个二维数组:
4
0 -2 -7 0 9 2 -6 2
-4 1 -4 1 -1
8 0 -2
第一行是二维数组的维数,接下来的四行是按行的输入数据,其中包含一个空行,我们需要将这些数据读入到一个二维数组中,直接使用scanf,fscanf,sscanf都不行,下面采用的方法是fgets读取每行,然后再逐个数据解析的方法:
#include<stdio.h>
int main()
{
//variables definition
int a[101][101];
char str[2000];
int g=1,h=1,count=0,len,s,n,i;
scanf("%d",&n);
while(fgets(str,100,stdin)!=NULL)
{
i=0;
s=0;
while(str[i]!='\0')
i++;
len=i-2;
while(s<=len)
{
i=s;
while((str[s]<='9'&&str[s]>='0')||str[s]=='+'||str[s]=='-')
s++;
a[g][h]=atoi(str,i,s-1);
count++;
h++;
if(h>n)
{
h=1;
g++;
}
if(g>n)
break;
while(s<=len&&str[s]!='+'&&str[s]!='-'&&!(str[s]<='9'&&str[s]>='0'))
s++;
}
if(count>=n*n)
break;
}
}
int atoi(char* num,int s,int e)
{
int result=0,flag=0;
if(s>e||num==NULL)
{
printf("Error!\n");
return;
}
if(num[s]=='-')
flag=1;
if(num[s]=='+'||num[s]=='-')
s++;
while(s<=e)
{
if(num[s]<='9'&&num[s]>='0')
result=result*10+(num[s]-'0');
else
{
printf("Error!\n");
return;
}
s++;
}
if(flag)
result=result*(-1);
return result;
}
atoi方法还有好多没有考虑的地方,不过在一般的读取应该是够用了。