1.从键盘输入一个字符串(以回车表示结束),统计其中的字母、数字和其它字符的个数。
main( )
{
char c;
int letter,digit,other;
letter=digit=other=0;
while((c=getchar())!=”\n”){
if(c>=”A”&&c<=”Z”||c>=”a”&&c<=”z”) letter++;
else if(c>=”0″&&c<=”9″) digit++;
else other++;
}
printf(“%d,%d,%d\n”,letter,digit,other);
}
[b]上面是题目和参考答案[/b]
#include <stdio.h>
main()
{
char str[50];
int i,a=0,n=0,e=0;
gets(str);
while(str[i]!=”\n”){
if(str[i]>=”A”&&str[i]<=”Z”||str[i]>=”a”&&str[i]<=”z”)
a++;
else if(str[i]>=”0″&&str[i]<=”9″)
n++;
else
e++;
}
printf(“%d,%d,%d”,a,n,e);
}
第二段代码使本人本人想的,不知道问题出在哪,运行不出来,是原因是对gets,getchar,和scnf概念的问题吗
main( )
{
char c;
int letter,digit,other;
letter=digit=other=0;
while((c=getchar())!=”\n”){
if(c>=”A”&&c<=”Z”||c>=”a”&&c<=”z”) letter++;
else if(c>=”0″&&c<=”9″) digit++;
else other++;
}
printf(“%d,%d,%d\n”,letter,digit,other);
}
[b]上面是题目和参考答案[/b]
#include <stdio.h>
main()
{
char str[50];
int i,a=0,n=0,e=0;
gets(str);
while(str[i]!=”\n”){
if(str[i]>=”A”&&str[i]<=”Z”||str[i]>=”a”&&str[i]<=”z”)
a++;
else if(str[i]>=”0″&&str[i]<=”9″)
n++;
else
e++;
}
printf(“%d,%d,%d”,a,n,e);
}
第二段代码使本人本人想的,不知道问题出在哪,运行不出来,是原因是对gets,getchar,和scnf概念的问题吗
解决方案
3
原因是你分配空间分配小了,char str[50],假如输入的是1000个字符呢?
25
#include <stdio.h> main() { char str[50]; int i = 0; int a = 0, n = 0, e = 0; gets(str); while(str[i] != "\0"){ if((str[i]>="A"&&str[i]<="Z") || (str[i]>="a"&&str[i]<="z")) a++; else if(str[i]>="0"&&str[i]<="9") n++; else e++; i++; } printf("%d,%d,%d", a, n, e); }
问题:
1, 变量i没有初始化,默认是一个随机值很容易导致数组str越界,导致段错误;
2. i没有在循环++,循环不能继续进行,也不能计算后面的字符;
3. gets不会将回车符加到缓存str里,所以,判断”\n”是不能让循环退出的,故需要改成”\0″
建议:不要使用gets,原因是它不知道缓存大小,容易导致越界;建议使用fgets
5
1.i未赋初值,系统会给一个不确定的值。因此会造成后续一系列问题。
2.while(while(str[i]!=”\n”){……},原因是前述原因,该循环体中,i值是系统随机给的值,str[i]取的是哪个,鬼晓得?这是是无法实现你设想的目的的。由于i的值是随机的,就意味着你的程序很有可能永远都无法跳出该循环体结束运行。
2.while(while(str[i]!=”\n”){……},原因是前述原因,该循环体中,i值是系统随机给的值,str[i]取的是哪个,鬼晓得?这是是无法实现你设想的目的的。由于i的值是随机的,就意味着你的程序很有可能永远都无法跳出该循环体结束运行。
5
i没有初始化,并且每次循环没有i++
2
为什么你要定义一个一维数组的char类型来统计