#include
int main()
{
int i,n=0,m=0,s=0,k=0,o=0; //n为大写字母 m为小写字母 s为数字 k为空格 o为其他
char *p,str[100];
printf("请输入一串字符:\n");
printf("\n");
for(i=0;str[i]=gets()!='\n';i++)
p=&str[i];
for(;*p!='\n';)
{ if(*p>='a'&& *p<='z')
m++;
else if(*p>='A'&& *p<='Z')
n++;
else if(*p>='0'&& *p<='9')
s++;
else if(*p=' ')
k++;
else
o++;
}
printf("小写字母为:%d",m);
printf("大写字母为:%d",n);
printf("数字为:%d",s);
printf("空格为:%d",k);
printf("其他为:%d",o);
printf("\n");
return 0;
}
你的p似乎没有移动 死循环了吧
你想要的函数应该是getch()
gets()函数有参数的,gets(str)才行
首先 str[i]=gets()!='\n' ----gets() 函数是这样调用吗?
其次,你检测的是一个 字符,所以应该是 用 getc函数吧,,,所以可以改为 str[i] = getc(stdin) != '\n',这样 str就算赋值了
再者,进入循环后,你的指针p刚开始所指向的是 str[i] = '\n'的吧,也就是最后一个字符,所以接下来的循环,可能有错的
最后,再 判断是那种字符的时候,你里面没有进行 P 的移动,如果是向后移动的话,上面的p初始指向应该是 str[0],
OK,就这样,我这边已经跑了一下,目前已经跑通了,代码就不贴了,你按照上面的改一下就OK
直接上代码吧,看看应该就懂了
#include<cstdio>
int main()
{
int i=0,n=0,m=0,s=0,k=0,o=0; //n为大写字母 m为小写字母 s为数字 k为空格 o为其他
char a,str[100];
printf("请输入一串字符:\n");
while(scanf("%c",&a)!=EOF)
str[i++]=a;
char *p=str;
for(;*p!=NULL;p++){
if(*p>='a'&& *p<='z')
m++;
else if(*p>='A'&& *p<='Z')
n++;
else if(*p>='0'&& *p<='9')
s++;
else if(*p==' ')
k++;
else
o++;
}
printf("小写字母为:%d",m);
printf("大写字母为:%d",n);
printf("数字为:%d",s);
printf("空格为:%d",k);
printf("其他为:%d",--o);//结尾多了一个换行符
printf("\n");
return 0;
}
我想你的本意不是想用 gets(), 而是 getchar(),按照你的意思,稍微修改了一下:
#include
int main()
{
int i,n=0,m=0,s=0,k=0,o=0; //n为大写字母 m为小写字母 s为数字 k为空格 o为其他
char *p,str[100];
printf("请输入一串字符:\n");
printf("\n");
for(i=0,str[0]=getchar();str[i]!='\n';)
{
i++;
str[i]=getchar();
}
p=&str[0];
for(;*p!='\n';p++)
{
if(*p>='a'&& *p<='z')
m++;
else if(*p>='A'&& *p<='Z')
n++;
else if(*p>='0'&& *p<='9')
s++;
else if(*p==' ')
k++;
else
o++;
}
printf("小写字母为:%d",m);
printf("大写字母为:%d",n);
printf("数字为:%d",s);
printf("空格为:%d",k);
printf("其他为:%d",o);
printf("\n");
return 0;
}
如果不能正确使用gets()函数,带来的危害是很大的,如果输入字符串的长度大于缓冲区长度时,不会截断,原样输出读入的字符串,造成程序崩溃。
所以建议一般情况下不要使用gets(),而且你的gets()用法错误。gets()函数原型如下:
char *gets(char *string);
你可以先声明一个数组,然后数组名作为参数。其实代码错误就是两个for循环使用不当,读入字符串错误,指针没有移动,自己看着改一下