鱼C论坛

 找回密码
 立即注册
查看: 1398|回复: 4

[已解决]给s14课后题给 整不会了

[复制链接]
发表于 2021-10-4 23:06:49 | 显示全部楼层 |阅读模式

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

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

x
我按顺序做
  1. while ((ch = getchar()) != '\n')
  2. {
  3.         printf("%c", ch);
  4. }
复制代码

的时候我在想  程序运行的时候应该是我打一个字符他接着输出一个字符来着  结果是 按下回车后 字符才全部出现
所以我觉得很奇怪  然后去百度搜了一下  发现原来 getchar是从缓冲区一个一个字符出来的
在循环里面加个Sleep就可以发现了  
然后 在动动手1.的时候
如果要用getchar来处理判断输入的字符该怎么做   想的我头有点大  
下面是我的代码
  1. #include<stdio.h>
  2. int main ()
  3. {
  4.         int  i[]={'0','1','2','3','4','5','6','7','8','9'};
  5.         int flag=1;
  6.         int  b=0;
  7.         char  w;
  8.         printf("请输入一个合法的数字:");
  9.         while(flag==1)
  10.         {
  11.                
  12.                 w=getchar();
  13.             for(b=0;b<=9;b++)
  14.             {
  15.                         if(w!=i[b] && w!='\n')   
  16.                   {
  17.                           printf("当前字符为:%d \n",i[b]);
  18.                           printf("请输入一个合法的数字:");
  19.                   
  20.                           break ;  
  21.                           if (b==9 )
  22.                         {
  23.                                 printf("请输入整数");
  24.                          }
  25.                   }
  26.                   
  27.         }
  28.                 }
  29. return 0;
  30.         }
  31.        
复制代码

这个是我写的  达不到效果 求助下大佬们
最佳答案
2021-10-5 01:35:34
本帖最后由 HalfNG 于 2021-10-5 01:38 编辑

按照你的代码调试了一下,改了些格式,发现有明显问题,比如第一个break语句
  1. for(b=0;b<=9;b++)
  2. {
  3.     if(w!=i[b] && w!='\n')   
  4.     {
  5.         printf("当前字符为:%d \n",i[b]);
  6.         printf("请输入一个合法的数字:");
  7.                   
  8.         break;
  9.                                   
  10.         if (b==9 ) printf("请输入整数");
  11.     }      
  12. }
复制代码

这使得你的代码在每次进入循环时,如果w的值不为字符'0',直接退出之后的代码不会再执行。

其次就是getchar()的使用,你的操作让我想起第一次使用getchar()时也是不能很准确的抓住想要的输入。逐个字符的输入看似只有一个,实则可能有多个,这个也是不可预知的
所以我选择使用一个循环来抓取字符,在进行相应的判断

这是我的代码,在你的基础上稍微修改,希望能对你有帮助
  1. #include<stdio.h>
  2. #define MAXLEN 10

  3. int main ()
  4. {
  5.     int i[ MAXLEN ] = { '0','1','2','3','4','5','6','7','8','9' };
  6.     int b, w, ch;
  7.         
  8.     printf("请输入一个合法的数字:");
  9.    
  10.     while(1)
  11.     {
  12.         ch = 0;
  13.            
  14.         while( ( w = getchar() ) &&
  15.                         (w != '\n' && w != EOF) )
  16.         { ch = w; }
  17.                
  18.         for( b = 0; b < MAXLEN; b++ )
  19.         {
  20.             if( ch == i[b] )   break;   
  21.         }
  22.                
  23.         if( b > MAXLEN-1 ) printf("\n请输入整数: ");
  24.         else
  25.         {
  26.                 printf("当前字符为:%c(%d) \n", i[b], i[b]);
  27.                 printf("\n请输入一个合法的数字:");
  28.         }       
  29.     }

  30.     return 0;
  31. }
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-10-5 01:35:34 | 显示全部楼层    本楼为最佳答案   
本帖最后由 HalfNG 于 2021-10-5 01:38 编辑

按照你的代码调试了一下,改了些格式,发现有明显问题,比如第一个break语句
  1. for(b=0;b<=9;b++)
  2. {
  3.     if(w!=i[b] && w!='\n')   
  4.     {
  5.         printf("当前字符为:%d \n",i[b]);
  6.         printf("请输入一个合法的数字:");
  7.                   
  8.         break;
  9.                                   
  10.         if (b==9 ) printf("请输入整数");
  11.     }      
  12. }
复制代码

这使得你的代码在每次进入循环时,如果w的值不为字符'0',直接退出之后的代码不会再执行。

其次就是getchar()的使用,你的操作让我想起第一次使用getchar()时也是不能很准确的抓住想要的输入。逐个字符的输入看似只有一个,实则可能有多个,这个也是不可预知的
所以我选择使用一个循环来抓取字符,在进行相应的判断

这是我的代码,在你的基础上稍微修改,希望能对你有帮助
  1. #include<stdio.h>
  2. #define MAXLEN 10

  3. int main ()
  4. {
  5.     int i[ MAXLEN ] = { '0','1','2','3','4','5','6','7','8','9' };
  6.     int b, w, ch;
  7.         
  8.     printf("请输入一个合法的数字:");
  9.    
  10.     while(1)
  11.     {
  12.         ch = 0;
  13.            
  14.         while( ( w = getchar() ) &&
  15.                         (w != '\n' && w != EOF) )
  16.         { ch = w; }
  17.                
  18.         for( b = 0; b < MAXLEN; b++ )
  19.         {
  20.             if( ch == i[b] )   break;   
  21.         }
  22.                
  23.         if( b > MAXLEN-1 ) printf("\n请输入整数: ");
  24.         else
  25.         {
  26.                 printf("当前字符为:%c(%d) \n", i[b], i[b]);
  27.                 printf("\n请输入一个合法的数字:");
  28.         }       
  29.     }

  30.     return 0;
  31. }
复制代码

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

使用道具 举报

 楼主| 发表于 2021-10-5 15:51:38 | 显示全部楼层
HalfNG 发表于 2021-10-5 01:35
按照你的代码调试了一下,改了些格式,发现有明显问题,比如第一个break语句

这使得你的代码在每次进入 ...

大佬 牛逼    所以用getchar来做那个课后题是不是不太行
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-7 18:23:22 From FishC Mobile | 显示全部楼层
anily 发表于 2021-10-5 15:51
大佬 牛逼    所以用getchar来做那个课后题是不是不太行

哈哈  不是不太行,是getchar( )的字符输入太呆板,你要建立自己的字符匹配模式来判断有哪些是你需要的,哪些是你不需要的。而且对输入数据还要确定这些准确性。
正确的读入有时比正确的输出困难,小甲鱼的题嘛,等你再成长成长,就能知道他的意义了(^_^)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-10-7 18:50:30 | 显示全部楼层
HalfNG 发表于 2021-10-7 18:23
哈哈  不是不太行,是getchar( )的字符输入太呆板,你要建立自己的字符匹配模式来判断有哪些是你需要的, ...

收到 我在摸索摸索
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-26 14:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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