鱼C论坛

 找回密码
 立即注册
查看: 1551|回复: 2

[已解决]各位大佬帮我看看我这个代码哪里出问题了

[复制链接]
发表于 2019-10-1 10:18:35 | 显示全部楼层 |阅读模式

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

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

x
#include <stdio.h>
#include <stdlib.h>
问题:输入三个字符后,按各字符的ASCII码从小到大的顺序输出这三个字符。
int main()
{
    char x,y,z;
    int i,j;
    while(scanf("%c%c%c",&x,&y,&z)!=EOF)
    {
        char Rank[]={x,y,z};
       for(i=1;i>=0;i--) // 控制最大下标
       {
          for(j=0;j<=i;j++)
          {
              if(strcmp(Rank[j],Rank[j+1])==1) //ASCII码值大则交换
              {
                  char temp;
                  temp=Rank[j];Rank[j]=Rank[j+1];Rank[j+1]=temp;//交换顺序,按小到大排序
              }
          }
       }
       printf("%c %c %c",Rank[0],Rank[1],Rank[2]);
    }
    return 0;
}
最佳答案
2019-10-1 13:15:14
本帖最后由 jackz007 于 2019-10-1 13:47 编辑

                   这一句

                if(strcmp(Rank[j],Rank[j+1])==1) //ASCII码值大则交换
               
                  必须改成下面这样:

                if(Rank[j] > Rank[j+1]) //ASCII码值大则交换

                while(scanf("%c%c%c",&x,&y,&z)!=EOF) { // 受键盘缓冲区滞留 '\n' 的干扰,循环状态下,不能保证正确获得字符。
                        . . . . . .
                }

                必须这样修改:

                while(scanf("%c%c%c",&x,&y,&z)!=EOF) {
                        . . . . . .
                        fflush(stdin)  ;                               // 添加此句,下一次 scanf() 读取键盘输入之前,清空键盘缓冲区
                }
                                

      程序应该有退出通道,下面的代码在键盘输入空回车的时候会退出运行。
#include <stdio.h>
#include <string.h>

int main()
{
        char s[82] , c[3] , x                                            ;
        int i , j                                                        ;
        for(;;) {
                printf("\n")                                             ;
                fgets(s , 80 , stdin)                                    ;
                if(strlen(s) > 1) {
                        sscanf(s , "%c%c%c" , & c[0] , & c[1] , & c[2])  ;
                        for(i = 1 ; i < 3 ; i ++) {
                                for(j = i ; j && c[j] < c[j - 1] ; j --) {
                                        x = c[j - 1]                     ;
                                        c[j - 1] = c[j]                  ;
                                        c[j] = x                         ;
                                }
                        }
                        printf("\n")                                     ;
                        printf("%c %c %c\n" , c[0] , c[1] , c[2])        ;
                } else {
                        break                                            ;
                }
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-1 13:15:14 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2019-10-1 13:47 编辑

                   这一句

                if(strcmp(Rank[j],Rank[j+1])==1) //ASCII码值大则交换
               
                  必须改成下面这样:

                if(Rank[j] > Rank[j+1]) //ASCII码值大则交换

                while(scanf("%c%c%c",&x,&y,&z)!=EOF) { // 受键盘缓冲区滞留 '\n' 的干扰,循环状态下,不能保证正确获得字符。
                        . . . . . .
                }

                必须这样修改:

                while(scanf("%c%c%c",&x,&y,&z)!=EOF) {
                        . . . . . .
                        fflush(stdin)  ;                               // 添加此句,下一次 scanf() 读取键盘输入之前,清空键盘缓冲区
                }
                                

      程序应该有退出通道,下面的代码在键盘输入空回车的时候会退出运行。
#include <stdio.h>
#include <string.h>

int main()
{
        char s[82] , c[3] , x                                            ;
        int i , j                                                        ;
        for(;;) {
                printf("\n")                                             ;
                fgets(s , 80 , stdin)                                    ;
                if(strlen(s) > 1) {
                        sscanf(s , "%c%c%c" , & c[0] , & c[1] , & c[2])  ;
                        for(i = 1 ; i < 3 ; i ++) {
                                for(j = i ; j && c[j] < c[j - 1] ; j --) {
                                        x = c[j - 1]                     ;
                                        c[j - 1] = c[j]                  ;
                                        c[j] = x                         ;
                                }
                        }
                        printf("\n")                                     ;
                        printf("%c %c %c\n" , c[0] , c[1] , c[2])        ;
                } else {
                        break                                            ;
                }
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-1 13:45:38 | 显示全部楼层
jackz007 发表于 2019-10-1 13:15
这一句

                if(strcmp(Rank[j],Rank[j+1])==1) //ASCII码值大则交换

是因为strcmp只能进行字符串的比较而不能进行字符的比较对吗?
我那个有退出渠道,就是输入CTRL+Z的时候就退出了- -不过谢谢你
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-16 15:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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