当前位置: 代码迷 >> C语言 >> [求助]字符串操作
  详细解决方案

[求助]字符串操作

热度:213   发布时间:2008-03-05 22:27:18.0
[求助]字符串操作
/*
题目是这样的:
输入一串字符,如
dgt125 ?458 .20
要把连续的字符组成一个整数,依次放到数组a中,如把125放到a[0],458放到a[1],20放到a[2]
输出数组元素:125 458 20
整数的个数:3
*/

#include"stdio.h"
#define N 64
int main(void)
{
    int i,j,k,flag=0,m=0,count=0;
    int a[N];
    char str[N],temp[N];
    printf("请输入一个字符串:");
    gets(str);
   
    for(i=0,j=0;str[i]!='\0';i++)
    {
       temp[0]='\0';                   //把temp置为空串
       while(str[i]<='9'&&str[i]>='0') //如果是数字字符进入
       {                                                            
            temp[j]=str[i];
            flag=1;                  
            if(str[i+1]>'9'||str[i+1]<'0')
            {
               temp[j+1]='\0';
               break;
            }
            i++;
            j++;
       }
       if(flag==1)//如果 flag==1表示已经temp[]中有整数,开始转换
       {  a[m]=0;
          for(k=0;j>=0;j--,k++)
          a[m]+=(temp[j]-48)*pow(10,k);
          m++;
          count++;   
          flag=0;
       }
    }                 
    printf("连续的整数为:");        
    for(i=0;i<=count-1;i++)
    printf("%d ",a[i]);
    printf("\n其中连续整数的个数是:%d\n",count);
    system("pause");
    return 0;
}

/*1.a[0]有时可以正确显示,有时会比输入少1(如123),以后的就不行了,都是只有后两位,如果是一位的,就是0
怎么回事啊,啊里出了问题?觉得应该是
for(k=0;j>=0;j--,k++)
a[m]+=(temp[j]-48)*pow(10,k);
中没有加最后一位.
但是第一个又是对了,真是郁闷......
谢谢了. */
搜索更多相关的解决方案: 字符  

----------------解决方案--------------------------------------------------------
#include"stdio.h"
#include"math.h"
#define N 64
int main(void)
{
    int i,j,k,flag=0,m=0,count=0;
    int a[N];
    char str[N],temp[N];
    printf("请输入一个字符串:");
    gets(str);
   
    for(i=0;str[i]!='\0';i++)
    {
           j=0;      
       while(str[i]<='9'&&str[i]>='0') //如果是数字字符进入
       {                                                      
            temp[j]=str[i];
            flag=1;                  
            if(str[i+1]>'9'||str[i+1]<'0')
            {
               temp[j+1]='\0';
               break;
            }
            i++;
            j++;
       }
       if(flag==1)//如果 flag==1表示已经temp[]中有整数,开始转换
       {  a[m]=0;
          for(k=0;j>=0;j--,k++)
          a[m]+=(temp[j]-48)*pow(10,k);
          printf("%d \n",a[m]);
          m++;
          count++;   
          flag=0;
       }
    }                 
    printf("连续的整数为:");        
    for(i=0;i<=count-1;i++)
    printf("%d ",a[i]);
    printf("\n其中连续整数的个数是:%d\n",count);
    getchar();
    return 0;
}

[[it] 本帖最后由 sunkaidong 于 2008-3-5 23:37 编辑 [/it]]
----------------解决方案--------------------------------------------------------

/* 利用scanf() 的返回值 */

#include <stdio.h>
#include <stdlib.h>
#define MAX 64


[bo]int[/bo] main([bo]void[/bo])
{
#if MAX == 0
    printf("\a#define MAX 0\nError!\n");
#else
    [bo]int[/bo] ar[MAX] = {0};
    [bo]int[/bo] i = 0;

    [bo]while[/bo] (i < MAX)
    {
        [bo]if[/bo] (scanf("%d", &ar[i] ) == 1)
            i++;
        [bo]else[/bo]
            getchar();
    }

    [bo]for[/bo] (i = 0; i < MAX; i++)
    {
        printf("%d ", ar[i]);
        [bo]if[/bo] (i % 8 == 7)
            putchar('\n');
    }
        
    putchar('\n');
#endif
    system("Pause");
    [bo]return[/bo] 0;
}


[[it] 本帖最后由 cosdos 于 2008-3-6 00:09 编辑 [/it]]
----------------解决方案--------------------------------------------------------
谢谢两位.真是
for(k=0;j>=0;j--,k++)
a[m]+=(temp[j]-48)*pow(10,k);
出了问题,当完成循环的时候,j==-1了.所以.后面的数会少一位.
在第一次循环下再把j=0;
还有点奇怪的时,怎么有的数会少1呢.是有的.并不是全部.
下面是测试数据:
----------------解决方案--------------------------------------------------------
顺着3#的思路.好像也不行哦.
主要是停不下来.就是a中要有MAX个元素才会停会有结果.
不知道该怎么控制.
while (i<MAX)
    {
        if (scanf("%d",&a[i])==1)i++;
        else if (getchar()=='\n')break;
    }
这样也不行.运行后,输入一串字符.比如123asd加回车
123可以到a[0];asd也可到三个getchar();但回车却到了scanf();了.这当然无法结束.
如果是数字结尾的,比如asd123加回车.asd可以到三个getchar();123可以到a[0];回车还是在scanf();......
还有,自己的那段也不行.就像楼上说的那样.
想了几天也不明白.真笨...
请求高人指点.谢谢了!

[[it] 本帖最后由 meteor57 于 2008-3-16 17:14 编辑 [/it]]
----------------解决方案--------------------------------------------------------
想抓狂......
原来是编译器搞的.
DEV C++4.9.9.2就会出上面的问题(有些数少1)
WIN TC1.9.1和VC++ 6.0就不会.
谁可以帮解释一下这种现象...
谢谢~~~
----------------解决方案--------------------------------------------------------
  相关解决方案