c程序设计题,对于有空行的二进制字符串转十进制怎么转?

/*----------------------------------------------------------------------
【程序设计】
------------------------------------------------------------------------
题目:已知半径为5,圆心为(6,9)的圆,字符串s给出一组以空格为分隔符的点的
      坐标,每个坐标的横、纵坐标值以逗号分隔,并以二进制字符串表示。
例如:char s[]= {"   101,10   11,101   1001,1010   "};
      表示的坐标为:(5,2), (3,5), (9,10), 它们与圆的位置关系如下:      
      点(5,2)在圆外
      点(3,5)在圆上
      点(9,10)在圆内 

编写程序:
1.编写 int change(char s[],int num[][3])函数,将s中所有二进制数字字符子
  串转换为用整数表示的点的坐标,存放在num数组的同一行前2列。
  函数返回坐标的个数。如果s的格式错,返回0。

2.编写 void calc(int num[][3],int n)函数,根据num数组中每行前2个元素所对
  应的点,判断点在圆的位置,其结果存放在第三列,若在圆上为0,圆外为1,
  圆内为2。
---------------------------------------------------------
注意:请勿改动主函数main()中的任何语句。
-------------------------------------------------------*/
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<ctype.h>
#include<stdlib.h>

int change(char s[],int num[][3]) 
{
/**********Program**********/




/**********  End  **********/
}

void calc(int num[][3],int n) 
{
/**********Program**********/




/**********  End  **********/
}
int main() 
{
    char s[]= {"   101,10   11,101   1001,1010   "};
    int num[10][3],i,n;
    char disp[][10]= {"上","外","内"};
    FILE *fp;
    if((fp=fopen("DATA.dat","w"))==NULL) 
    {
        printf("File open error\n");
        exit(0);
    }
    n=change(s,num);
    if (n==0) 
    {
        printf("参数错\n") ;
        fprintf(fp,"参数错\n") ;
    } 
    else 
    {
        calc(num,n);
        for(i=0; i<n; i++) 
        {
            printf("点(%d,%d)在圆%s\n",num[i][0],num[i][1],disp[num[i][2]]);
            fprintf(fp,"点(%d,%d)在圆%s\n",num[i][0],num[i][1],disp[num[i][2]]);
        }
    }
    fclose(fp);
    return 0;

}

 

int change(char s[],int num[][3]) 
{
/**********Program**********/
	int i=0;
	int point=0;
	int x_hex, y_hex;
	int x, y;
	int count = 0;
	int ret = 0;
	int x_temp = 0;
	int y_temp = 0;

	while(s[i])
	{
		if(s[i] == ' '){ //找到坐标的起始位置, 忽略空格是为了方便查找下一个坐标
			i++;
			continue;
		}
		//通过sscanf函数读取XY坐标值
		ret = sscanf(&s[i], "%x,%x", &x_hex, &y_hex);  //以十六进制读取,坐标的二进制字符"101"读取后为"0x101"。目的是方便用位移来转换成十进制数值
		if(ret == 1)//格式错误。正常情况要么2要么0。
			return 0;
		if(ret == 0 )//后面没有坐标了
			return count;
		printf("x hex=0x%x, y hex=0x%x\n", x_hex, y_hex);

		//将十六进制表示的X坐标转换成十进制数值
		point = 0;//二进制数值的位置
		x  = 0;
		while(x_hex)
		{
			if(x_hex & 0xf)//判断后4位是否为1,这里每4位是一个二进制位的值
				x  += pow(2, point);//当为1时,累加2^point,point是二进制字符位置
			x_hex  = x_hex >>4;//右移4位
			point ++;
		}

		//将十六进制表示的Y坐标转换成十进制数值
		point = 0;//二进制数值的位置
		y  = 0;
		while(y_hex)
		{
			if(y_hex & 0xf)//判断后4位是否为1,这里每4位是一个二进制位的值
				y  += pow(2, point);//当为1时,累加2^point,point是二进制字符位置
			y_hex  = y_hex >>4; //右移4位
			point ++;
		}

		//保存坐标数值
		num[count][0] = x;
		num[count][1] = y;
		num[count][2] = 0;//位置默认0
		count ++;
		printf("x=%d, y=%d\n", x, y);

		//查找下一个坐标,以空格为标记
		while(s[i])
		{
			if(s[i] == ' ')
			    break;
			i++;
		}
	}
	return count;
/**********  End  **********/
}

看起来比较复杂,或许会有更好的方案!

只写了那两个函数里面的东西,其他没动

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<ctype.h>
#include<stdlib.h>
 
int change(char s[],int num[][3]) 
{
/**********Program**********/
    int *left = (int *)malloc(sizeof(int));//,号左
    int *right = (int *)malloc(sizeof(int));//,号右
    int *cur_l = left;
    int *cur_r = right; 
    for(int i = 0; s[i] != '\0'; i++){
        if(s[i] == ','){//获取,号下标 
            *left = i;
            left++;
        }
        else if((s[i] == '0' || s[i] == '1') && s[i+1] == ' '){//获取每段二进制数后的第一个空位置下标 
            *right = i+1;
            right++;
        }
    }
    *left = *right = -1;//标记指针尾为-1
    int sum = 0;//每段二进制码的值 
    int j = 1;
    int count = 0;
    for( ; *cur_l != -1; cur_l++){//,号左边的十进制数值 
        for(int i = *cur_l-1; s[i] != ' '; i--){
            sum += (s[i]-'0') * j;
            j *= 2;
        }
        num[count++][0] = sum;
        sum = 0;
        j = 1;
    }
    count = 0;
    for( ; *cur_r != -1; cur_r++){//,号右边的十进制数值 
        for(int i = *cur_r-1; s[i] != ','; i--){
            sum += (s[i]-'0') * j;
            j *= 2;
        }
        num[count++][1] = sum;
        sum = 0;
        j = 1;
    } 
     return count;
/**********  End  **********/
}
 
void calc(int num[][3],int n) 
{
/**********Program**********/
    int dis;
    int r = pow(5,2);
    for(int i = 0; i < n; i++){
         dis = pow(num[i][0]-6, 2) + pow(num[i][1]-9,2);
         if(dis < r)
             num[i][2] = 2;
         else if(dis == r)
             num[i][2] = 0;
         else
             num[i][2] = 1;
    }
/**********  End  **********/
}
int main() 
{
    char s[]= {"   101,10   11,101   1001,1010   "};
    int num[10][3],i,n;
    char disp[][10]= {"上","外","内"};
    FILE *fp;
    if((fp=fopen("DATA.dat","w"))==NULL) 
    {
        printf("File open error\n");
        exit(0);
    }
    n=change(s,num);
    if (n==0) 
    {
        printf("参数错\n") ;
        fprintf(fp,"参数错\n") ;
    } 
    else 
    {
        calc(num,n);
        for(i=0; i<n; i++) 
        {
            printf("点(%d,%d)在圆%s\n",num[i][0],num[i][1],disp[num[i][2]]);
            fprintf(fp,"点(%d,%d)在圆%s\n",num[i][0],num[i][1],disp[num[i][2]]);
        }
    }
    fclose(fp);
    return 0;
 
}