我目前正在尝试按字母顺序排列列表。我试图让用户输入一行,其中包含要排序的单词数。以下每一行都将输入一个新单词。单词不包含空格,并以行返回结束。我知道简单的方法是使用scanf
或fgets
阅读所有内容,但是我的微处理器无法处理这些函数,迫使我使用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;
}
答案 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放在一个单独的循环中,以便您可以检查用户是否按正确的顺序输入数据。在用户输入数字之前,您不想开始阅读单词,因此您知道要阅读的数量。