鱼C论坛

 找回密码
 立即注册
查看: 1975|回复: 7

[已解决]C语言,求助!!!

[复制链接]
发表于 2021-1-7 13:49:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
做了一个统计输入的各个数字、空白符(空格、制表符、换行符)以及所有其他字符出现的次数,并分别存储在变量num[10],blank,others里边打印的程序。但是运行结果却是乱码,求大神指点!!!
下面是我写的代码:
#include<stdio.h>
int main()
{
    int a,b,d,i,j,k;
    int num[10]={0};
    char blank[10]={'\n'},others[10]={'?'},c;
     a=b=d=0;
     while((c=getchar())!=EOF)
     {
             if((c==' ')||(c=='\t')||(c=='\n'))
     {          blank[b]=c;++b;}
              if((c>=0)||(c<=9))
              {                  num[a]=c;++a;}
              else
              others[d]=c;++d;
         }
         for(i=0;i<a+1;i++)
         printf("%d,",num[i]);
         for(j=0;j<b+1;j++)
         printf("%c,",blank[j]);
         for(k=0;k<d+1;k++)
         printf("%c,",others[k]);
         
         printf("%d,%d,%d\n",a-1,b-1,d-1); 
        return 0;   
 } 
最佳答案
2021-1-7 14:42:16
#include<stdio.h>
int main()
{
        int a = 0, b = 0, d = 0, i, j, k;
        int num[10] = { 0 };
        char blank[10], others[10], c;     // blank[10]、others[10] 没有必要初始化
        while ((c = getchar()) != '\n')
        {
                if ((c == ' ') || (c == '\t') || (c == '\n'))
                {
                        blank[b] = c;
                        ++b;                       // b 没有初始化
                }
                if ((c >= '0') && (c <= '9'))  // 数字是一个整体,要用 && ,不能用 ||;并且输入的是字符型数字,要加单引号
                {
                        num[a] = c;
                        ++a;                       // a 没有初始化
                }
                else
                {                             // 不加花括号,无论前面是哪种情况,++d 都会自加一次,是输出乱码的来源
                        others[d] = c;
                        ++d;                      // d 没有初始化
                }
        }
        
        for (i = 0;i < a;i++)
                printf("%c,", num[i]);
        printf("\n");                    // 不换行,输出的数据将堆一起,无法分辨

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

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

        printf("%d,%d,%d\n", a - 1, b - 1, d - 1);
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-1-7 13:59:41 | 显示全部楼层
你的程序是个死循环 ! 因为 EOF 是一个标志,它是不能由键盘输入的。若由键盘输入 EOF,编译器会认为是输入了三个字母 E、O、F
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-7 14:42:16 | 显示全部楼层    本楼为最佳答案   
#include<stdio.h>
int main()
{
        int a = 0, b = 0, d = 0, i, j, k;
        int num[10] = { 0 };
        char blank[10], others[10], c;     // blank[10]、others[10] 没有必要初始化
        while ((c = getchar()) != '\n')
        {
                if ((c == ' ') || (c == '\t') || (c == '\n'))
                {
                        blank[b] = c;
                        ++b;                       // b 没有初始化
                }
                if ((c >= '0') && (c <= '9'))  // 数字是一个整体,要用 && ,不能用 ||;并且输入的是字符型数字,要加单引号
                {
                        num[a] = c;
                        ++a;                       // a 没有初始化
                }
                else
                {                             // 不加花括号,无论前面是哪种情况,++d 都会自加一次,是输出乱码的来源
                        others[d] = c;
                        ++d;                      // d 没有初始化
                }
        }
        
        for (i = 0;i < a;i++)
                printf("%c,", num[i]);
        printf("\n");                    // 不换行,输出的数据将堆一起,无法分辨

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

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

        printf("%d,%d,%d\n", a - 1, b - 1, d - 1);
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-7 16:00:11 | 显示全部楼层

多谢大神!但是还有一些问题,就是在输入空格的时候,他还会被算到其他字符里面,结果输出的时候会在数组blank和others里面都有,其他字符的计数也加上了空格的次数,这是什么情况啊?还有就是,如果我要输入一篇文章的话,那回车作为结束字符的话不就不能正常统计了吗?当时我在CSDN上搜了EOF这个,上面说他相当于F6或者Ctry+z 把它输入在行的最前面时再按回车就可以退出了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我没有帮你修改程序,只是在你自己的程序上,告诉你,出了些什么样的错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-7 17:03:42 | 显示全部楼层
风过无痕1989 发表于 2021-1-7 16:18
我没有帮你修改程序,只是在你自己的程序上,告诉你,出了些什么样的错误

谢谢!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[50], blank[50], others[50], letter[50], ch;
        while ((ch = getchar()) != '\n')
        {
                if ((ch == ' ') || (ch == '\t') || (ch == '\n'))
                {
                        blank[b] = ch;
                        ++b;
                }
                else if ((ch >= '0') && (ch <= '9'))
                {
                        num[a] = ch;
                        ++a;
                }
                else if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'))
                {
                        letter[c] = ch;
                        ++c;
                }
                else
                {
                        others[d] = ch;
                        ++d;
                }
        }

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

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

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

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

        printf("数字:%d 个,空格:%d 个,字母:%d 个,其他:%d 个\n", a, b, c, d);
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-7 17:22:56 | 显示全部楼层
风过无痕1989 发表于 2021-1-7 17:12
帮你加了一个数组,记录字母

谢谢!!!
看到这个我发现刚刚那个时第二个if前没加else,导致出现问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-10 11:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表