鱼C论坛

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

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

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

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

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

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

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

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

  35.         printf("%d,%d,%d\n", a - 1, b - 1, d - 1);
  36.         return 0;
  37. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

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

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

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

  35.         printf("%d,%d,%d\n", a - 1, b - 1, d - 1);
  36.         return 0;
  37. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

我没有帮你修改程序,只是在你自己的程序上,告诉你,出了些什么样的错误
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

谢谢!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

帮你加了一个数组,记录字母
  1. #include<stdio.h>
  2. int main()
  3. {
  4.         int a = 0, b = 0, d = 0, c = 0, i;
  5.         char num[50], blank[50], others[50], letter[50], ch;
  6.         while ((ch = getchar()) != '\n')
  7.         {
  8.                 if ((ch == ' ') || (ch == '\t') || (ch == '\n'))
  9.                 {
  10.                         blank[b] = ch;
  11.                         ++b;
  12.                 }
  13.                 else if ((ch >= '0') && (ch <= '9'))
  14.                 {
  15.                         num[a] = ch;
  16.                         ++a;
  17.                 }
  18.                 else if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'))
  19.                 {
  20.                         letter[c] = ch;
  21.                         ++c;
  22.                 }
  23.                 else
  24.                 {
  25.                         others[d] = ch;
  26.                         ++d;
  27.                 }
  28.         }

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

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

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

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

  41.         printf("数字:%d 个,空格:%d 个,字母:%d 个,其他:%d 个\n", a, b, c, d);
  42.         return 0;
  43. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

谢谢!!!
看到这个我发现刚刚那个时第二个if前没加else,导致出现问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-26 18:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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