我正在编写一个程序,打印出一个特定宽度/高度的正方形或三角形,并且发生了一些非常奇怪的事情。如果我没有输入正确的字符来开始程序(S,T或Q),输入将再次显示,但会重复,这取决于我输入的字符数不正确。这是我的代码:
#include <stdio.h>
#include <ctype.h>
void print_square(int n, char c) {
for (int i=0; i < n; i++) {
for (int j=0; j < n; j++) {
printf("%c", c);
}
printf("\n");
}
}
void print_triangle(int n, char c) {
int count = 1;
for (int i=0; i < n; i++) {
for (int j=0; j < count; j++) {
printf("%c", c);
}
count = count + 1;
printf("\n");
}
}
int main(int argc, const char * argv[]) {
int n;
char cmd;
char c;
do {
printf("Enter T for a triangle, S for a square, "
"Q to quit: ");
scanf("%c", &cmd);
cmd = toupper(cmd);
if (cmd == 'S' || cmd == 'T') {
printf("Enter the size: ");
scanf("%d", &n);
printf("Enter the character: ");
scanf(" %c", &c);
if (cmd == 'S') {
print_square(n, c);
}
else {
print_triangle(n, c);
}
}
} while (cmd != 'T' && cmd != 'S' && cmd != 'Q');
return 0;
}
知道造成这种情况的原因是什么?
答案 0 :(得分:1)
记住输入时你必须做一步:
1 - 输入字符
2 - 输入“Enter”,表示“\ n”
当您使用scanf(“%c”)时,它会将字符存储在cmd中。当您输入'a'时,您将按'a'并输入'\ n',a将存储在cmd中。 '\ n'将以堆栈形式存储。正如您所看到的,这与条件不匹配,因此循环发生并且步骤
printf(“输入T表示三角形,S表示正方形”, “Q退出:”);
happend。 然后它将'\ n'存储在cmd中,因为以下是scanf(“%c”,cmd)。 它再次运行并再次循环。
我的建议是在这种情况下在scanf()之后使用getchar()。它会抛出不必要的'\ n'away。