【发布时间】:2018-10-15 02:50:30
【问题描述】:
我做了一个比较三个字符的代码,并根据 ASCII 数字从高到低对其进行排序。第一个输入是很多情况要解决,然后输入三个字符进行排序。例如,如果我们输入& ^ %,我们期望的输出是Case #1: % & ^。
#include <stdio.h>
int main(){
int cases, counter = 1;
char ch1, ch2, ch3, storage;
scanf("%d", &cases);
getchar();
while(counter <= cases){
scanf("%c %c %c", &ch1, &ch2, &ch3);
//process
while(ch1 < ch2 < ch3){
if(ch1 < ch2){
storage = ch1;
ch1 = ch2;
ch2 = storage;
}
if(ch2 < ch3){
storage = ch2;
ch2 = ch3;
ch3 = storage;
}
}
//end process
printf("case #%d: %c %c %c\n", counter, ch1, ch2, ch3);
counter++;
}
return 0;
}
但在我输入三个字符后它卡住了,它不会显示输出,我无法为下一个案例输入任何字符。
【问题讨论】:
-
使用调试器单步调试代码。
-
写
while (ch1 < ch2 < ch3)可能不会像你想的那样,特别是如果你先学习了Python。在 C 中,它将ch1与ch2进行比较,并产生一个值 0 或 1;然后将该值与ch3进行比较。几乎总是,0 和 1 都小于ch3,因此循环将继续,继续,继续,继续,直到你厌倦为止。 -
启用 编译器警告(例如,对于 gcc/clang 的最小值
-Wall -Wextra,对于 VS (cl.exe) 的最小值/W3)并且在编译之前不要接受代码警告。阅读并理解编译器告诉你的内容。 -
"我输入三个字符后卡住" --> 尝试
" %c %c %c"而不是"%c %c %c"(添加空格)。ch1 < ch2 < ch3也是个问题。 -
如果优先级是指 C 运算符优先级,那么赋值是无稽之谈。一元地址运算符
&的优先级高于模数%,而模数&的优先级又高于位与&。