如何使用getchar按字母顺序排列列表

时间:2014-09-17 00:41:15

标签: c getchar

我目前正在尝试按字母顺序排列列表。我试图让用户输入一行,其中包含要排序的单词数。以下每一行都将输入一个新单词。单词不包含空格,并以行返回结束。我知道简单的方法是使用scanffgets阅读所有内容,但是我的微处理器无法处理这些函数,迫使我使用getchar()。截至目前,当它打印出排序列表时,它只是打印垃圾。我觉得我的代码出了问题,但我对编程很新,无法弄清楚。任何帮助表示赞赏。

#include <stdio.h>
#include <string.h>

     int main()
    {
        int i, j;
        char  string[10][20], temp[20];
        int num;

        while(1)
        {
            char ch = getchar();
            if(ch == 0)
                continue;
            if(ch <= 0x39 && ch >= 0x30)
            {
                putchar(ch);
                num = ch - 0x30;
            }
            if(ch == 0x0D)
                printf("\n\r");
            if (ch <= 0x7A && ch >= 0x61)
            {
                putchar(ch);
                for(i=0; i<=num; i++)
                {
                    for(j=0; j<=20; j++)
                        string[i][j] = ch;
                }
            }
            if(ch== 0x20)
                break;
        }
        for (i = 0; i < num - 1 ; i++)
           {
               for (j = i + 1; j < num; j++)
               {
                   if (strcmp(string[i], string[j]) > 0)
                   {
                       strcpy(temp, string[i]);
                       strcpy(string[i], string[j]);
                       strcpy(string[j], temp);
                   }
               }
           }
           printf("\nSorted Names\n");
           for (i = 0; i < num; i++)
           {
               printf("%s\n", string[i]);
           }
           return 0;
    }

1 个答案:

答案 0 :(得分:2)

首先,您需要NULL - 终止您读入的字符串。所以您应该更改检查以返回:

if ( ch == 0x0D )
{
    string[i][j] = '\0';
    printf( "\n\r" );
}

其次,你一次只读一个角色,但是你为每个角色做了一个for循环。这是完全错误的。您需要在while循环中跟踪i和j,并将每个角色放入正确的位置。我不打算为你写这个,因为它非常简单:当一个角色介于&#39; a&#39;之间时,摆脱双循环。和&#39; z&#39;收到并设置字符串[i] [j] = ch然后增加j。只需检查以确保j先小于20。

然后,每次看到0x0D字符时,只需递增i,并在i> = = num时将while循环更改为退出。

另外,在读取单词之前,我会将读取的num放在一个单独的循环中,以便您可以检查用户是否按正确的顺序输入数据。在用户输入数字之前,您不想开始阅读单词,因此您知道要阅读的数量。