免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1466 | 回复: 8
打印 上一主题 下一主题

有个关于字符串的题,感觉自己写的不好! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-08-19 20:16 |只看该作者 |倒序浏览
把一串字符串中的数字用一个数组存着,比如说
1290eirjif09ddfe343kk454l434k2l656l;
a[0]=1290;
a[1]=9;
a[2]=343;
a[3]=454
a[4]=434;
a[5]=2;
a[6]=656;
感觉自己的代码效率不是很高,那位大虾能够指点一下!
感觉自己走了一些弯路。

  1. #include <string.h>
  2. #include <stdio.h>
  3. #define IN  1
  4. #define OUT 0
  5. main()
  6. {
  7. int  state1;

  8. int  state2=OUT;

  9. int  i=-1;

  10. int  j=0;

  11. int  n=0;

  12. int *number;

  13. char c;

  14. char str[100][10]={"0"};

  15. FILE *fp;

  16. fp=fopen("data.dat","w+");

  17. if(NULL==fp)
  18. {

  19. printf("space is not enough");

  20. exit(1);

  21. }


  22. while((c=getchar())!='\n')
  23. {

  24. if((c>='0')&&(c<='9'))
  25. {
  26.   
  27.   state1=IN;

  28.   if(OUT==state2)
  29.   {
  30.    
  31.    if(i>=0)
  32.    {
  33.    
  34.    str[i][j]='\0';
  35.    
  36.    }
  37.   
  38.    j=0;
  39.    
  40.    i++;
  41.   
  42.   }

  43.   str[i][j++]=c;

  44. }  
  45. else
  46. {

  47. state1=OUT;

  48. }

  49. state2=state1;

  50. }

  51. str[i][j]='\0';

  52. n=i;

  53. number=(int*)malloc((n+1)*sizeof(int));

  54. for(i=0; i<=n; i++)
  55. {

  56. number[i]=charge(str[i]);

  57. printf("%d\n",number[i]);

  58. fprintf(fp,"the number[%d]=%d\n",i,number[i]);

  59. }

  60. free(number);

  61. }

  62. int charge(char *str)
  63. {

  64. char *pch;

  65. char *pch_end;

  66. int sum=0;

  67. pch_end=strlen(str)+str;

  68. for(pch=str;pch<pch_end;pch++)
  69. {

  70. sum=10*sum+*pch-'0';

  71. }

  72. return sum;


  73. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2006-08-19 21:05 |只看该作者

  1. #include <stdlib.h>
  2. #include <ctype.h>

  3. void foolfoolbird(char *str,int *arr)
  4. {
  5.         while(*str != 0) {
  6.                 for(;!isdigit(*str)&&*str!=0;str++);
  7.                 if(0==*str) break;
  8.                 *arr++=atoi(str++);
  9.                 for(;isdigit(*str)&&*str!=0;str++);
  10.         }
  11. }
复制代码

注意:这个代码没有对整数数组做边界检测

[ 本帖最后由 默难 于 2006-8-19 21:13 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2006-08-19 23:00 |只看该作者
套用我在a64中用的语句解析模式,  str数组根据实际设大小:

  1. #define is_n(c)  (((c) >= '0') && ((c) <= '9')))

  2. int parse_XXX(s)
  3. {
  4.          if (!s || !s[0])
  5.                  return 0;

  6.          char str[10][30];
  7.          int i = 0;
  8.          int j = 0;
  9.         
  10.          for (;;) {
  11.                 if (is_n(*s)) {
  12.                      str[i][j++] = *s;     
  13.                 } else switch(*s) {
  14.                 case 0: goto done;
  15.                 case ' ': break;
  16.                  ... ...                             /* 更多的字符选项 */
  17.                  ... ...
  18.                  default:
  19.                         if (j) {
  20.                                 str[i++][j] = 0;
  21.                                 j = 0;
  22.                         }
  23.                  }
  24.                  s++;
  25.          }

  26. done:
  27.         /*  ......   */
  28. }
复制代码

我基本上都用这种方式解析语句,发觉非常实用有效,供LZ参考一下
不过这段代码一些还是要修改的,这里只是指出一种方法

[ 本帖最后由 mik 于 2006-8-19 23:11 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2006-08-20 12:12 |只看该作者
刚刚吃饭的时候脑壳有点开窍
呵呵!
精简了一下
比昨天的短多了
哈哈!


  1. #include <stdio.h>
  2. #define IN  1
  3. #define OUT 0
  4. main()
  5. {
  6. int  state1;

  7. int  state2=OUT;

  8. int  i=-1;

  9. char c;

  10. int number[100]={0};

  11. FILE *fp;

  12. fp=fopen("data.dat","w+");

  13. if(NULL==fp)
  14. {

  15. printf("space is not enough");

  16. exit(1);

  17. }


  18. while((c=getchar())!='\n')
  19. {

  20. if((c>='0')&&(c<='9'))
  21. {
  22.   
  23.   state1=IN;

  24.   if(OUT==state2)
  25.   {
  26.    
  27.     if(i>=0)
  28.     {
  29.    
  30.     fprintf(fp,"the number[%d] is %d\n",i,number[i]);
  31.    
  32.     }

  33.    
  34.     i++;
  35.   
  36.   }

  37.     number[i]=10*number[i]+c-'0';

  38.   

  39. }  
  40.   else
  41.    {

  42.    state1=OUT;

  43.    }

  44.    state2=state1;

  45. }

  46.   fprintf(fp,"the number[%d] is %d\n",i,number[i]);

  47. }
复制代码

论坛徽章:
0
5 [报告]
发表于 2006-08-20 14:34 |只看该作者
学会用函数,不要把所有的东西都堆在main里面

论坛徽章:
0
6 [报告]
发表于 2006-08-21 16:12 |只看该作者

我写了一个程序,老是得不到正确结果

#include "stdio.h"
#define MAX_PATH =1000

main()
{ int stor[1000],i=0,j=0,k;
  char *temp= NULL,*temp1= NULL,*temp2=NULL;
            temp = (char *)malloc(1000 * sizeof(char));
            temp1=(char *)malloc(1000* sizeof(char));
            temp2=(char *)malloc(1000 * sizeof(char));

  char *sour="123$sdfsfjk94893849#zncn^3iuwi3i884982 sjksdjf0909 =288sjiwuoqp1";
      for   (;*sour;sour++)
     { if (*sour>47 &&*sour<5
         { temp1=temp;
           *temp++ =*sour ;
             i++;
          }
         else if (i>0)
             {
              *temp='\0';
              strcpy(temp2,temp1);
              stor[j++]=atoi(*temp2);
              i=0;
              }
     }
   for (i=0;i<=j;i++)
      printf("%d\n",stor[i]);

}

论坛徽章:
0
7 [报告]
发表于 2006-08-21 21:07 |只看该作者
重新该了一下,这个编译通过了,而且结果也是正确的
#include "stdio.h"
#define MAX_PATH =1000

main()
{ int stor[100],i=0,j=0;
  char* temp=NULL;
  temp=(char *)malloc(100*sizeof(char));   //if ommit this line will segment core

  char *sour="123$sdfsfjk94893849#zncn^3iuwi3i884982 sjksdjf0909 =288sjiwuqp1";
  for(;*sour;sour++)
     { if (*sour>47 &&*sour<5
         {*temp=*sour;i++;temp++;}     //if *temp++=*sour; will
         else if (i>0)
             {*temp='\0';
                  for(;i>0;i--)
                         temp--;
              stor[j++]=atoi(temp);
              
              }
     }
   for (i=0;i<j;i++)
      printf("%d\n",stor);

}

[ 本帖最后由 declare 于 2006-8-21 21:22 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2006-08-22 00:15 |只看该作者
楼上的指针用的可真好
以后可要多多关照啦
但是我发现一点小小的错误!
我仿照你的又写了一个这个应该不错了

  1. #include<stdio.h>
  2. main()
  3. { int   stor[100];
  4.   
  5.   int   i=0;
  6.   
  7.   int   j=0;
  8.   
  9.   char  c;
  10.   
  11.   char  *temp=NULL;
  12.   
  13.   temp=(char *)malloc(100*sizeof(char));   //if ommit this line will segment core
  14.        
  15.   while((c=getchar())!='\n')
  16.   {
  17.   
  18.   
  19.   if((c>='0')&&(c<='9'))
  20.   {
  21.    
  22.    *temp++=c;
  23.    
  24.    i++;
  25.    
  26.   }else if(i>0)
  27.    {
  28.     *temp='\0';
  29.    
  30.         for(;i>0;i--)  
  31.     {
  32.          temp--;
  33.     }
  34.    
  35.     stor[j++]=atoi(temp);
  36.   
  37.    
  38.   
  39.    }

  40. }
  41.   *temp='\0';
  42.   
  43.   for(;i>0;i--)
  44.           temp--;
  45.   stor[j]=atoi(temp);
  46.   
  47.   for(i=0;i<=j;i++)
  48.   {
  49.    
  50.    printf("stor[%d]=%d\n",i,stor[i]);

  51.   }




  52. }

复制代码

论坛徽章:
0
9 [报告]
发表于 2006-08-22 11:39 |只看该作者
free(temp);
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP