| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1009 人关注过本帖
标题:C语言高手解答下
只看楼主 加入收藏
lqpqbyb
Rank: 1
等 级:新手上路
帖 子:18
专家分:8
注 册:2011-1-8
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:10 
C语言高手解答下
请教大家一下,有题如下:
输入一个字符串,内有数字和非数字字符,如
a123x456 17960? 302tab5876
将其中连续的数字作为一个整数,依次存放到一数组a中。例如:123
放在a[0],456放在a[1]......统计共有多少个整数,并输出这些数。
以下是c代码:#include <stdio.h>
main()
{char str[50],*pstr;
int i,j,k,m,e10,digit,ndigit,a[10],*pa;
printf("Input a string:\n");
gets(str);
pstr=str;
pa=a;
ndigit=0;
i=0,j=0;
while(pstr[i])
 {if(pstr[i]>=47&pstr[i]<=58)
     j++;
  else
    {if(j>0)
       {digit=pstr[i-1]-48;
k=1;
while(k<j)
 {e10=1;
  for(m=1;m<=k;m++)
   e10=e10*10;
   digit=digit+(pstr[i-1-k]-48)*e10;
   k++;
 }
*pa++=digit;
ndigit++;
j=0;
       }
    }
 i++;
}
printf("There are %d numbers in this line.They are:\n",ndigit);
pa=a;
for(j=0;j<ndigit;j++)
printf("%d ",pa[j]);
printf("\n");
}
当输入字符串时,如果是输完按回车键,得出的结果就跟题目要求不一样,比如:
输入
a123x456 17960? 302tab5876(备注:前面有二个空格,输完5876直接按回车)
在turboc2.0运行得到以下结果
123 456 17960 302
但当输入
a123x456 17960? 302tab5876(备注:前面有二个空格,输完5876,先空格一下,再按回车键)
得出结果
123 456 17960 302 5876
输入其它的字符串也同上述那种结果。
有点搞不明白,懂的赐教一下,先谢谢先了。
搜索更多相关主题的帖子: 字符串 C语言 统计 字符串 C语言 统计 
2011-01-11 13:53
lqpqbyb
Rank: 1
等 级:新手上路
帖 子:18
专家分:8
注 册:2011-1-8
收藏
得分:0 
补充下:&位运算 &&逻辑运算这二个都试过(if(pstr[i]>=47&pstr[i]<=58)或if(pstr[i]>=47&&str[i]<=58)),在turboc2.0运行,结果都一样。
2011-01-11 13:56
huangapple
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:545
专家分:1790
注 册:2010-12-30
收藏
得分:3 
我刚才想了很久了。。。。在群里就为你想了很久了,什么问题啊?
写程序注释来点比较好

[ 本帖最后由 huangapple 于 2011-1-11 14:06 编辑 ]

勤能补拙,熟能生巧!
2011-01-11 14:04
观弈寒儒
Rank: 7Rank: 7Rank: 7
来 自:自 来
等 级:黑侠
帖 子:359
专家分:545
注 册:2011-1-9
收藏
得分:3 
回复 楼主 lqpqbyb
还是那句话,你代码一个汉字的注释都没有,这样别人很难看。。。
外加一句,虽然我进来了,但我不是高手。
也到我那边的帖子逛逛啊。

[ 本帖最后由 观弈寒儒 于 2011-1-11 14:15 编辑 ]

事件记录,值得关注! http://bbs.bccn.net/z_court.php?fid=5
2011-01-11 14:08
lqpqbyb
Rank: 1
等 级:新手上路
帖 子:18
专家分:8
注 册:2011-1-8
收藏
得分:0 
哈哈
2011-01-11 14:38
li_danwang
Rank: 4
来 自:鄂州
等 级:业余侠客
帖 子:112
专家分:203
注 册:2010-11-12
收藏
得分:3 
顶上...

没事来C一下...   
2011-01-11 14:42
lqpqbyb
Rank: 1
等 级:新手上路
帖 子:18
专家分:8
注 册:2011-1-8
收藏
得分:0 
不过我知道自己错在哪了。
在语句:printf("There are %d numbers in this line.They are:\n",ndigit);
前面补充如下语句就可了:
if(j>0)
{digit=pstr[i-1]-48;
     k=1;
     while(k<j)
      {e10=1;
         for(m=1;m<=k;m++)
         e10=e10*10;
         digit=digit+(pstr[i-1-k]-48)*e10;
         k++;
      }
 *pa=digit;
 ndigit++;   
 i++;
}
之前没加这段程序之前,就会出现输入字符串后按不按空格再回车结果不同。
由于统计连续整数的个数放在while循环体中的else 语句后面,因此在以下情况会造成结果才输出
输入的字符串比如:1 2 3 4(备注:前面有三个空格,只有四个数字)
当程序执行到4字符时,前面已经统计有三个数字了,但当程序执行到4字符后的结束符'\0'时,跳出while循环,因此就没把4字符统计进去。
因此在输入的字符串:1 2 3 4 (备注:前面有四个空格(4后面有空格),四个数字)结果就把4字符统计进去,因为4后面有空格字符。
不过把统计整数个数放在if前面,一碰到数字就统计个数,应该可以避免出现以上结果,不过相应程序要改动。嘿嘿
2011-01-11 14:54
qq1023569223
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:湖南科技大学
等 级:贵宾
威 望:26
帖 子:2753
专家分:13404
注 册:2010-12-22
收藏
得分:3 
那么楼主打算怎么给分呢?给自己吧。

   唯实惟新 至诚致志
2011-01-11 18:15
点线面
Rank: 8Rank: 8
来 自:NO.-1
等 级:蝙蝠侠
帖 子:525
专家分:980
注 册:2011-1-3
收藏
得分:3 
程序代码:
#include <stdio.h>
#include "conio.h"
#include<stdlib.h>



int main(int argc, char* argv[])
{ 
   char a[80],strj=0,strk = 1;
   int i,k=0;
   long b[80],sum=0;

   puts("iunput");
    gets(a);
   
   for(i=0;a[i];++i)       
   {
       b[i] = 0;

        if(a[i]>='0'&&a[i]<='9')
        {
            strk = 0;
            strj = 0; 
             sum =a[i] - '0' +sum * 10; //将字符转化数字方程
        }
        else
            strj = 1;
        if(strj &(strk ==0))   //判断开关
        {
            b[k++] =sum;
            sum =0;          //还原,不然程序出错
            strk = 1;
        }
   }

        if(sum)   //处理尾数
         b[k++] =sum;      
   /*输出部分*/
   puts("putout");
   for(i=0;i<k;i++)
       printf("%d ",b[i]);
   printf("\nTimes: %d",k);
   getchar();
   return 0;
   
}


[ 本帖最后由 点线面 于 2011-1-11 19:30 编辑 ]

小代码,大智慧
2011-01-11 19:28
点线面
Rank: 8Rank: 8
来 自:NO.-1
等 级:蝙蝠侠
帖 子:525
专家分:980
注 册:2011-1-3
收藏
得分:0 
程序代码:
#include <stdio.h>
#include "conio.h"
#include<stdlib.h>

int strint(char *a,long *b)
{
    char strj = 1;
    int i,k = 0;
    long sum=0;

    for(i=0;a[i];++i)       
   {
       b[i] = 0;

        if(a[i]>='0'&&a[i]<='9')
        {
            strj = 0;
             sum =a[i] - '0' +sum * 10;
        }
        else
          strj = strj |2;

          if(strj==2)    //开关判断
        {
            b[k++] =sum;
            sum =0;          //还原,不然程序出错  
            strj = strj |1;
        }
   }

        if(sum)   //处理尾数
         b[k++] =sum;   
        return k;
}

int main(int argc, char* argv[])
{ 
   char a[80];
   long b[80];
   int i,k;

   puts("iunput");
    gets(a);

   k=strint(a,b); 
   
   /*输出部分*/
   puts("putout");
   for(i=0;i<k;i++)
       printf("%d ",b[i]);
   printf("\nTimes: %ld",k);
   getchar();
   return 0;
   
}
程序方式同上

小代码,大智慧
2011-01-11 20:15
快速回复:C语言高手解答下
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.067852 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved