标题:新手求助
只看楼主
lxk1732942
Rank: 6Rank: 6
等 级:侠之大者
威 望:7
帖 子:450
专家分:425
注 册:2018-9-4
结帖率:96.43%
已结贴  问题点数:20 回复次数:6 
新手求助
题目:输入一个字符串,内有数字和非数字字符,例如:
        12sf s3df4s6@#$dsadd41dfsdf
      将其中连续的数字作为一个整数,依次存放到一数组a中。例如,12放在a[0],3放在a[1]......统计共有多少个整数,并输出这些数。
代码如下:
程序代码:
#include<stdio.h>
int tongji(char *,int *);
int main(void)
{
    char str[50]="\0";
    int a[50];
    int i,n;
    printf("输入一个字符串:");
    gets(str);
    n=tongji(str,a);
    printf("共计%d个数\n",n);
    for(i=0;i<n;i++)
        printf("%c%5d",i%5?'\0':'\n',a[i]);
    printf("\n");
    return 0;
}
int tongji(char *p,int *a)
{
    int i=0,j=0,t;
    while( *(p+i)!='\0' )
    {
        for( ; *(p+i)<'0' || *(p+i)>'9' ; i++ );
        if( *(p+i)=='\0' )
            break;
        for( t=0 ; *(p+i)>='0' && *(p+i)<='9' ; i++)
            t=t*10+*(p+i)-'0';
        *(a+j++)=t;
    }
    return j;
}


无错误提示。

运行结果如下:


搞不明白为什么会多出来几个数
搜索更多相关主题的帖子: int char printf for i++ 
2018-11-16 11:16
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:7 
吐槽一下,鄙视提问都不肯交代清楚的人。

char str[50]="\0";
------ 题目有说字符串长度不超过49吗?如果有,你为什么不贴出来?!

int a[50];
------ 题目有说最大整数不超过int的上限吗?如果有,你为什么不贴出来?!
------ 题目说了“连续的数字作为一个整数”,这话难道暗含着包含负号(-)的意思?如果不是,那为什么不用unsigned类型?!

gets(str);
------ gets 在 1999年被标准废弃,2011年被标准删除。

for( ; *(p+i)<'0' || *(p+i)>'9' ; i++ );
------ 不考虑 *(p+i) == '\0' 的情况啦?
------ *(p+i) 为什么不学正常人写成 p[i]?

其它,变量到处瞎放,const不写,……
2018-11-16 14:00
lxk1732942
Rank: 6Rank: 6
等 级:侠之大者
威 望:7
帖 子:450
专家分:425
注 册:2018-9-4
得分:0 
回复 2楼 rjsp
不是啊,我这是书上的一道题,原封不动抄上来的,至于50,由于题目并未交代字符串长度,我自己随便写的。

gets被废除这件事书中并未提及,我的书是谭浩强的《C语言程序》第三版,书中例子涉及字符串输入输出也是用的gets和puts。

for( ; *(p+i)<'0' || *(p+i)>'9' ; i++ );
------ 不考虑 *(p+i) == '\0' 的情况啦?
这个确实我没考虑到,以为最外层循环考虑就OK了。

------ *(p+i) 为什么不学正常人写成 p[i]?
自学C语言,刚学完指针,感觉指针不好理解,就强迫自己多用指针。

变量到处瞎放是什么意思,不是很清楚,还望大神指点。

const这东西不写主要是我不清楚为什么要写,个人感觉用不到啊
2018-11-16 14:25
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
回复 3楼 lxk1732942
不交代 字符串最大长度数字最大长度 的话,代码没法写呀。
如果我代码中写个50,实际上它输入51个字符怎么办?如果我代码中写个500000,它实际输入500001个字符怎么办?总不至于为这道小题目写个list吧

“我的书是谭浩强的《C语言程序》第三版” ------ 看《谭浩强》毁一生。

勉强写一个(随便问问,你用什么编译器?如果是 Turbo C、VC2013之前的低版本VC 等就要改代码了,因为它们不支持当今人类用的C语言):
程序代码:
#include <stdio.h>

enum { STRING_MAX_LENGTH=80 }; // 字符串可能的最大长度

size_t foo( const char* s, char nums[][STRING_MAX_LENGTH+1] );

int main( void )
{
    char line[STRING_MAX_LENGTH+1];
    printf("输入一个字符串:");
    scanf( "%[^\n]", line );

    char nums[(STRING_MAX_LENGTH+1)/2][STRING_MAX_LENGTH+1];
    size_t n = foo( line, nums );
    printf( "共计%zu个数\n", n );
    for( size_t i=0; i!=n; ++i )
        puts( nums[i] );
}

size_t foo( const char* s, char nums[][STRING_MAX_LENGTH+1] )
{
    size_t row=0,col=0;
    for( ; *s; ++s )
    {
        if( *s>='0' && *s<='9' )
        {
            nums[row][col++] = *s;
        }
        else if( col != 0 )
        {
            nums[row++][col] = '\0';
            col = 0;
        }
    }
    if( col != 0 )
        nums[row++][col] = '\0';
    return row;
}

测试:
程序代码:
输入:
输出:
    共计0个数

输入:
    abc
输出:
    共计0个数

输入:
    12
输出:
    共计1个数
    12

输入:
    12sf s3df4s6@#$dsadd41dfsdf
输出:
    共计5个数
    12
    3
    4
    6
    41

输入:
    9876543210123456789___x_9999999999999
输出:
    共计2个数
    9876543210123456789
    9999999999999



2018-11-16 14:58
lxk1732942
Rank: 6Rank: 6
等 级:侠之大者
威 望:7
帖 子:450
专家分:425
注 册:2018-9-4
得分:0 
回复 4楼 rjsp
看了你的回答甚是恐怖,谭浩强的这本书,是我们学校计算机专业的教科书,另外,老师给的编译器是VC6,理由是简单

另外,他的这本书,我已经快看完了,但是感觉基础还是不扎实,还望大神推荐一本C语言书,好让我正确学习C语言,感谢
还有,我在咱们这个网站上搜了下资源,全都是VC6,并未发现VC13以及更新的版本,还望大神提供资源,本人对于编程十分喜爱,望成全


[此贴子已经被作者于2018-11-16 17:39编辑过]

2018-11-16 17:36
C基础
Rank: 6Rank: 6
等 级:侠之大者
威 望:6
帖 子:133
专家分:421
注 册:2018-10-15
得分:7 
回复 4楼 rjsp
你别吓我啊  我也在看谭浩强的书呢
2018-11-16 19:23
rohalloway
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:97
专家分:405
注 册:2018-9-28
得分:7 
以下是引用lxk1732942在2018-11-16 17:36:19的发言:

看了你的回答甚是恐怖,谭浩强的这本书,是我们学校计算机专业的教科书,另外,老师给的编译器是VC6,理由是简单

另外,他的这本书,我已经快看完了,但是感觉基础还是不扎实,还望大神推荐一本C语言书,好让我正确学习C语言,感谢
还有,我在咱们这个网站上搜了下资源,全都是VC6,并未发现VC13以及更新的版本,还望大神提供资源,本人对于编程十分喜爱,望成全


程序设计篇

这里的的程序语言主要以C、ASM为主,毕竟自己主要也只是学这两门语言,其它脚本语言,如PHP、ASP就不提了。关于C语言的书籍就有传说中的 “C语言四大名著”,即《C程序设计语言》、《C和指针》、《C陷阱与缺陷》、《C专家编程》,感觉在C编程上这几本书就够用了,至于数据结构和算法可参 考其它国外名著。国产的编程书籍没几本可出手的,关于C入门书籍,很多人会推荐谭浩强那书,最初我也是读这本书入门的,但后来慢慢地发觉那书不是很好,错 误不少,编程风格也不好。对于那些写着精通XXX、24小时XXX、30天XXX、XXX从入门到精通,这些书都是拿书名来忽悠人的,纯粹是作者用来骗稿 费的,对比一下那些国外名著的书名就知道了,一本好书一般是不会用那些土名字的。另外有些认为语言学得越多越牛,但是这样会广而不精,其实语言主攻一两门 就够了。有不少人见当今流行什么语言就学什么,编程书籍一下子买了不少,这语言一本,那语言一本,最后啥也没看成,都在那书架上晾着呢。我很赞成SAI兄 弟说的,半年之内不接触的技术,就不用去买这方面的书籍了。关于ASM主要就《80x86汇编语言程序设计》、《windows环境下的32位汇编程序设 计》这两本,汇编语言的书籍相对会少一点,一些网上书店的程序设计一栏中连asm都没有分类出来。很多编程书籍的内容写的都是千篇一律,比如C语言书籍, 不外乎都是些变量、数组、指针这些,但是某些书籍中就会有提到编程风格、内存优化、树、链表、折半搜索法,GDB调试,linux方面的知识,比如《c primer plus》《C和指针》,这些也算是书本的一个亮点。关于windows编程,首推《windows程序设计》上下册、《windows核心编程》。编程 书籍由于附有很多代码,在电脑上看电子版的感觉很伤眼,容易眼疲劳,因此有必要的话,可以买实体书来看,而且在实际应用中,有时可以再拿出来参考参考,方 便查阅。如果打印比你买书便宜的话,你就可以选择打印,也可以在书城站着免费给它瞄完,或者到网上买盗版书,在淘宝上可以网购到,个人感觉买盗版书还是挺 划算的。但是与此同时,也要奉劝大家“纸上得来终觉浅,绝知此事要躬行”,特别是对于编程学习者,一定要动手写代码,光看书是没用,这也是我曾经犯过的错 误!而且有些书是用来参考查阅,不是用来看的,不然即使你把那些牛书都看完 ,到最后也可能连几句代码也写不出来,最后受伤的永远是你自己!




此内容是转载的,这里有提到C语言的书籍,另外我也不建议你以谭浩强为主
2018-11-17 17:10



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-491316-1-1.html




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

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