初夏沁梨 发表于 2021-1-7 13:49:02

C语言,求助!!!

做了一个统计输入的各个数字、空白符(空格、制表符、换行符)以及所有其他字符出现的次数,并分别存储在变量num,blank,others里边打印的程序。但是运行结果却是乱码,求大神指点!!!{:9_221:}
下面是我写的代码:
#include<stdio.h>
int main()
{
    int a,b,d,i,j,k;
    int num={0};
    char blank={'\n'},others={'?'},c;
   a=b=d=0;
   while((c=getchar())!=EOF)
   {
           if((c==' ')||(c=='\t')||(c=='\n'))
   {          blank=c;++b;}
          if((c>=0)||(c<=9))
          {                  num=c;++a;}
          else
          others=c;++d;
       }
       for(i=0;i<a+1;i++)
       printf("%d,",num);
       for(j=0;j<b+1;j++)
       printf("%c,",blank);
       for(k=0;k<d+1;k++)
       printf("%c,",others);
       
       printf("%d,%d,%d\n",a-1,b-1,d-1);
        return 0;   
}

风过无痕1989 发表于 2021-1-7 13:59:41

你的程序是个死循环 ! 因为 EOF 是一个标志,它是不能由键盘输入的。若由键盘输入 EOF,编译器会认为是输入了三个字母 E、O、F

风过无痕1989 发表于 2021-1-7 14:42:16

#include<stdio.h>
int main()
{
        int a = 0, b = 0, d = 0, i, j, k;
        int num = { 0 };
        char blank, others, c;   // blank、others 没有必要初始化
        while ((c = getchar()) != '\n')
        {
                if ((c == ' ') || (c == '\t') || (c == '\n'))
                {
                        blank = c;
                        ++b;                     // b 没有初始化
                }
                if ((c >= '0') && (c <= '9'))// 数字是一个整体,要用 && ,不能用 ||;并且输入的是字符型数字,要加单引号
                {
                        num = c;
                        ++a;                     // a 没有初始化
                }
                else
                {                           // 不加花括号,无论前面是哪种情况,++d 都会自加一次,是输出乱码的来源
                        others = c;
                        ++d;                      // d 没有初始化
                }
        }
       
        for (i = 0;i < a;i++)
                printf("%c,", num);
        printf("\n");                  // 不换行,输出的数据将堆一起,无法分辨

        for (j = 0;j < b;j++)
                printf("%c,", blank);
        printf("\n");                  // 不换行,输出的数据将堆一起,无法分辨

        for (k = 0;k < d;k++)
                printf("%c,", others);
        printf("\n");                  // 不换行,输出的数据将堆一起,无法分辨

        printf("%d,%d,%d\n", a - 1, b - 1, d - 1);
        return 0;
}

初夏沁梨 发表于 2021-1-7 16:00:11

风过无痕1989 发表于 2021-1-7 14:42


多谢大神{:10_297:}!但是还有一些问题,就是在输入空格的时候,他还会被算到其他字符里面,结果输出的时候会在数组blank和others里面都有,其他字符的计数也加上了空格的次数,这是什么情况啊?还有就是,如果我要输入一篇文章的话,那回车作为结束字符的话不就不能正常统计了吗?当时我在CSDN上搜了EOF这个,上面说他相当于F6或者Ctry+z 把它输入在行的最前面时再按回车就可以退出了。

风过无痕1989 发表于 2021-1-7 16:18:08

初夏沁梨 发表于 2021-1-7 16:00
多谢大神!但是还有一些问题,就是在输入空格的时候,他还会被算到其他字符里面,结果输出的时 ...

我没有帮你修改程序,只是在你自己的程序上,告诉你,出了些什么样的错误

初夏沁梨 发表于 2021-1-7 17:03:42

风过无痕1989 发表于 2021-1-7 16:18
我没有帮你修改程序,只是在你自己的程序上,告诉你,出了些什么样的错误

谢谢!!!{:10_297:}

风过无痕1989 发表于 2021-1-7 17:12:50

初夏沁梨 发表于 2021-1-7 16:00
多谢大神!但是还有一些问题,就是在输入空格的时候,他还会被算到其他字符里面,结果输出的时 ...

帮你加了一个数组,记录字母
#include<stdio.h>
int main()
{
        int a = 0, b = 0, d = 0, c = 0, i;
        char num, blank, others, letter, ch;
        while ((ch = getchar()) != '\n')
        {
                if ((ch == ' ') || (ch == '\t') || (ch == '\n'))
                {
                        blank = ch;
                        ++b;
                }
                else if ((ch >= '0') && (ch <= '9'))
                {
                        num = ch;
                        ++a;
                }
                else if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'))
                {
                        letter = ch;
                        ++c;
                }
                else
                {
                        others = ch;
                        ++d;
                }
        }

        for (i = 0;i < a;i++)      // 输出数字
                printf("%c,", num);
        printf("\n");

        for (i = 0;i < b;i++)      // 输出空格
                printf("%c,", blank);
        printf("\n");

        for (i = 0;i < c;i++)      // 输出字母
                printf("%c,", letter);
        printf("\n");

        for (i = 0;i < d;i++)      // 输出其他
                printf("%c,", others);
        printf("\n");

        printf("数字:%d 个,空格:%d 个,字母:%d 个,其他:%d 个\n", a, b, c, d);
        return 0;
}

初夏沁梨 发表于 2021-1-7 17:22:56

风过无痕1989 发表于 2021-1-7 17:12
帮你加了一个数组,记录字母

谢谢!!!{:7_126:}
看到这个我发现刚刚那个时第二个if前没加else,导致出现问题{:7_113:}
页: [1]
查看完整版本: C语言,求助!!!