100分问一道关于C语言题的问题

题目为输入一段文本,分离出单词(以字母开头的由字母数字组成的字符序列)
例如:
88a123*.**abcd\;123a123,-xs1s
分离出单词为
a123
abcd
a123
xs1s

我的程序
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define CNUM 10
#define NNUM 20
#define MAX 50

int main()
{
char ch[MAX];
char memo[CNUM][NNUM];
char *pst;
int chon = 1;
int a = 0,b = 0;
int x = 1;

gets(ch);
pst = ch;

while(*pst != '\0')
{
if(isalpha(*pst))
{
chon = 0;
memo[a][b] = *pst;
b++;
pst++;
}
else if(isdigit(*pst) == 1 && chon == 0)
{
memo[a][b] = *pst;
b++;
pst++;
}
else
{
if(chon == 0)
{
chon = 1;
a++;
b = 0;
pst++;
}
else
pst++;
}
}

for(x = 0;x <= a;x++)
{
puts(memo[x]);
putchar('\n');
}

system("pause");
}

输出的结果很奇怪,请问是哪里的问题,说明原因,可能的话帮忙修改下程序
个人觉得可能应该不是指针的问题

谢谢!

改了几个地方,其实都是为了一个目的,给串的最后加上'\0',具体修改的地方标记出来了,有问题hi我

还有一个小问题,isdigit(*pst)当是数字时返回值不是1,而是4

#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define CNUM 10
#define NNUM 20
#define MAX 50

int main()
{
char ch[MAX];
char memo[CNUM][NNUM];
char *pst;
int chon = 1;
int a = 0,b = 0;
int x = 1;

gets(ch);
pst = ch;

while(*pst != '\0')
{
if(isalpha(*pst))
{
chon = 0;
memo[a][b] = *pst;
b++;
pst++;
}
else if(isdigit(*pst) && chon == 0) //返回值不是1,而是4
{
memo[a][b] = *pst;
b++;
pst++;
}
else
{
if(chon == 0)
{
memo[a][b]='\0'; //1111111
chon = 1;
a++;
b = 0;
pst++;
}
else
pst++;
}
}
if(chon == 0) //2222222222222222
memo[a][b]='\0';
for(x = 0;x <= a;x++)
{
puts(memo[x]);
putchar('\n');
}

system("pause");
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-11-02
我看了一下,你的程序肯定有错,在循环里面,我改改看
第2个回答  2009-11-02
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define CNUM 10
#define NNUM 20
#define MAX 50

int main()
{
char ch[MAX];
char memo[CNUM][NNUM];
char *pst;
int chon = 1;
int a = 0,b = 0;
int x = 1;

gets(ch);
pst = ch;

while(*pst != '\0')
{
if(isalpha(*pst))
{
chon = 0;
memo[a][b] = *pst;
b++;
pst++;
}
else if(isdigit(*pst)&&b!=0)// == 1 && chon == 0)//楼主的意思是想以字母开头,当然b!=0了,你判断的是不是数字,而不仅仅是0和1吧!
{
memo[a][b] = *pst;
b++;
pst++;
}
else
{
if(chon == 0)
{
chon = 1;
a++;
b = 0;
pst++;
}
else
pst++;
}
}

for(x = 0;x <= a;x++)
{
puts(memo[x]);
putchar('\n');
}

system("pause");
}
其它都ok,我试了符合你要求
第3个回答  2009-11-02
查了一下,你这个程序第一个问题在于
char memo[CNUM][NNUM];
未清空,也就是未初始化,故内存中申请的空间可能存在各种各样的奇怪字符,一直到出现'\0'了才结束打印。
第二个问题在于 isdigit() 这个函数在验证失败时候返回0,验证成功时候返回非0(见百度百科),故isdigit(*pst) == 1 这里不对。否则打印出来的只有字母,没有后面的数字。

以下是我修改的代码
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define CNUM 10
#define NNUM 20
#define MAX 50

int main()
{
char ch[MAX];
char memo[CNUM][NNUM];
char *pst;
int chon = 1;
int a = 0,b = 0;
int x = 1;
memset(memo,'\0',sizeof(memo));
gets(ch);
pst = ch;

while(*pst != '\0')
{
if(isalpha(*pst))
{
chon = 0;
memo[a][b] = *pst;
b++;
pst++;
}
else if(isdigit(*pst) != 0 && chon == 0)
{
memo[a][b] = *pst;
b++;
pst++;
}
else
{
if(chon == 0)
{
chon = 1;
a++;
b = 0;
pst++;
}
else
pst++;
}
}

for(x = 0;x <= a;x++)
{
puts(memo[x]);
putchar('\n');
}

system("pause");
}

参考资料:http://baike.baidu.com/view/1275773.htm?fr=ala0

求解一道英文C语言题,100分
\/\/原题翻译如下:作业6问题1。【15标记的正确性。文件:周期。]假如你是给定一个数组的n个整数。阵列中的每个整数给职位数跳向前或向后从当前位置。例如,如果当前位置是2和[ 2 ] 3,你的下一个位置将5。如果[ 5 ]是4,那么你的下一个位置将是1。在计算下一个位置,你应该考虑以下:下一个...

亲,关于C语言的两个问题,100分悬赏!!!
(1) 浮点类型的数用4个字节32位二进制表示。这样表示的数大约有7位十进制有效数字,数值的表示范围约为±(3.4×10^38…3.4×10^38);(2) 双精度类型的数用8个字节64位二进制表示,双精度数大约有16位十进制有效数字,数值的表示范围约为±(1.7×10^308…1.7×10^308);(3) 长双...

问个关于C语言输出百分制成绩的问题
呵呵.给你个提示.你自己弄吧.这题关键是把分数变成一个确定的整数值.因为,switch()要求的参数只能是一个确定的数值.比如,85-100为A,你可以把这个段的分数加上5再除以10,这样就可以得到9和10这两个数.用到case里就可以了.好了.给你个开头吧...int k;k=(score+5)\/10;switch(k){ case 10...

c语言问题
char str[100];printf("%d\\n",sizeof(str));\/\/答案是100 func(str);} void func(char str[100]){ printf("%d\\n",sizeof(str));\/\/答案是4 } 为什么会出现这种情况呢,原因是因为两者有着本质性的区别,第一个sizeof(str)中的str是一个 地址常量,它索引着一段大小为100的内存堆,而...

追加100分C语言求解
展开前 max=MAX(x,y);因为展开后的: max=(a,b) (a>b)?a:b; 不符合C语言的语法,无法理解、求解和计算,所以说显然错误。问题二 第二问为什么说无法得到语气结果 根据定义的S(x)=x*x, 本意是要实现平方的。S(3+2); 就是要实现 5*5的。而展开的 3+2*3+2虽然可以用C的语言去...

C语言笔试题!求答案!另送100积分!
1.说说下列声明的不同之处 char *a = "abc";char b[] = "abc";char c[3] = "abc";a是一个字符型指针变量,起内容为字符串”abc”的首地址,字符串”abc”存放在常量区。b[ ]占4个字节,b[0]=’a’ ,b[1]= ‘b’,b[2]=’ c’,[3]=’\\0’c[3]占3个字节,c[0]=’...

C语言100分求解
=str[n-1-i]) {flag=0;break;} \/\/如果不符合回文条件,flag赋值为0if(flag) \/\/如果flag=1,就说明一直符合回文条件 { printf("Yes"); }else \/\/如果flag=0,就说明至少有一处不符合回文条件 { printf("No"); }printf("\\n");} ...

100分求千行C语言程序源代码
c语言高级之类的。反正多的是。如果我要复制一段代码给你感觉不是很爽。随便复制给你你拿来做什么呢。 已赞过 已踩过< 你对这个回答的评价是? 评论 收起 匿名用户 2009-06-03 展开全部 送个最简单的给你。int x=1;x=2;x=3;x=4;\/\/……x=7000;如此类推,七千行。也算应付任务。老师不会怪你...

c语言问题:
if(!ok1)a=1;} 第一个成立,第二个也成立;第三个就不成立了,OK1==5;!OK就为假了,这是一具判断表达式真假的问题;C中规定判断表达式只要值不为0即为真,是负数或正数都为真,为0即为假;else if(ok2)a=10;a=-1;printf("%d\\n",a)进入ELSE语句时进行 if(ok2)a=10;因为OK2...

C语言经典题目
1.正确的算法:如果n=3, 过河时间为A+B+C 如果n<=2, 好算, 不费口舌了 如果n>=4, 这个是重点:每次优先考虑把最慢两人送过河 把n人中最快两人记为A,B, 最慢两人记为C,D(过河时间A<B<C<D), n人问题实质上转换为4人过河问题, 参考到4人过河时的优化,记AB过河, A回, CD过河, B...

相似回答
大家正在搜