指针,要求输出多少个大小写字母,空格等,下面这段程序哪里有问题?求解

#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循环使用不当,读入字符串错误,指针没有移动,自己看着改一下