Chinaunix首页 | 论坛 | 博客
  • 博客访问: 154409
  • 博文数量: 64
  • 博客积分: 2545
  • 博客等级: 少校
  • 技术积分: 692
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-22 20:00
文章分类

全部博文(64)

文章存档

2011年(3)

2009年(51)

2008年(10)

我的朋友

分类: C/C++

2008-07-01 15:36:22

/*下面这个简单程序功能是从键盘读入一个由6个空格隔开的7个字符段构成的一个完成的原始字符串,如: 12 Lao Wang 20 13 15 22,然后对这个字符串加以分析后提取数据.要提取的数据分别为整数 12,字符串 Lao,字符串 Wang,整数 20,整数 13,整数 15,以及整数 22.假定编程者已知该原始字符串的以上这个格式.但这个程序仍然存在一个效率问题,请各位一起探讨一下能不能尽量提高它的效率以应付数量很大的数据处理,谢谢!*/

/* Turning space-broken string processing*/

#include
#include

#define MAXSIZE 80
#define MAXNUM  20

void showitems(char * ); //处理并显示提取后的数据
int strtoint(char * ); //将输入字符串中的表示整数的字符段转化成整数并返回
int decpow(int);    //计算以10为底的n次幂并返回

int main(void){

    char str[MAXSIZE];
    char * strptr = str;

    printf("\nPlease enter the string:\n";
    gets(strptr); //从键盘获得数据
    showitems(strptr);

    return 0;
}

void showitems(char * str){

  //分别用7个字符数组将7个由空格隔开的字符段分别
  //存储起来以备处理
    char item_a[MAXNUM],item_b[MAXNUM],item_c[MAXNUM],item_d[MAXNUM],
         item_e[MAXNUM],item_f[MAXNUM],item_g[MAXNUM];
  //用两个指针存储以上字符数组中的两个的地址,这两个
  //字符数组用来存储7个字符段中表示字符串的两个字符段
    char * itm_b = item_b, * itm_c = item_c, * itmptr;
  //a-g用来记录提取的整数,k 用来记录已经抽取的字符
  //的数目
    int a,d,e,f,g,k = 0;
    int j = 0; //j用来跟踪原始字符串的扫描进度

    itmptr = item_a; //复制第一字符数组的地址
  //这个循环获取表示整数的字符段
    while(*str){

    if(str[j] == ' ')
            break; //碰到空格跳出
     //将原始字符串中的非空格字符复制到 item_a 中
    * itmptr = str[j]; 
        itmptr++;
        k++;
        j++;
    }
    item_a[k] = '\0'; //让item_a成为字符串以备处理
    a = strtoint(item_a); //将item_a转化成整数
    j++; //让数据扫描跳过空格

    k = 0; //让k归零以便重新使用
  //以下两个循环获取表示字符串的字符段
    while(*str){

    if(str[j] == ' ')
            break;

    * itm_b = str[j];
        itm_b++;
        k++;
        j++;
    }
    item_b[k] = '\0';
    j++;
   
    k = 0;
    while(*str){

    if(str[j] == ' ')
            break;

    * itm_c = str[j];
        itm_c++;
        k++;
        j++;
    }
    item_c[k] = '\0';
    j++;

   //以下几个程序块和第一个块功能一样
 //都是获取表示整数的字符段
    k = 0;
    itmptr = item_d;
    while(*str){

    if(str[j] == ' ')
            break;

    * itmptr = str[j];
        itmptr++;
        j++;
        i++;
    }
    item_d[k] = '\0';
    d = strtoint(item_d);
    j++;

    i = 0;
    itmptr = item_e;
    while(*str){

    if(str[j] == ' ')
            break;

    * itmptr = str[j];
        itmptr++;
        j++;
        i++;
    }
    item_e[k] = '\0';
    e = strtoint(item_e);
    j++;

    i = 0;
    itmptr = item_f;
    while(*str){

    if(str[j] == ' ')
            break;

    * itmptr = str[j];
        itmptr++;
        j++;
        i++;
    }
    item_f[k] = '\0';
    f = strtoint(item_f);
    j++;

    i = 0;
    itmptr = item_g;
    while(*str){

    if(str[j] == ' ')
            break;

    * itmptr = str[j];
        itmptr++;
        j++;
        i++;
    }
    item_g[k] = '\0';
    g = strtoint(item_g);

    printf("\n%d %s %s %d %d %d %d",a,item_b,item_c,d,e,f,g);
}

int strtoint(char * str){

    int i = 0;

    while(* str){

        if(*str < '0' || *str > '9'){
            return -1;
            break;
        } //过滤非数字字符

        i += (int)(*str - 4 * decpow(strlen(str)); //求得整数值
        str++;
    }

    return i;
}

int decpow(int n){

    int i;
    int product = 1; //幂

    if(n == 1)
        return product; //n为1时另幂为1
    else{
        for(i = 1; i < n; i++)
            product *= 10; //计算以10为底的n次幂,n>1

        return product;
    }
}
 
原文:=字符串
阅读(1301) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~