我使用循环来确定输入是否正确,如果错误则再次询问,直到输入有效为止,程序确实会运行,但我必须多次输入数字。如果我在另一台机器上运行代码,它只需第一个输入即可顺利运行。 这是一个示例,但无论我选择什么循环,它都是相同的。
while (input != 1 || getchar() != '\n') {
while ((c = getchar()) != '\n' && c != EOF) { }
input = scanf ("%d", &number);
if (input != 1 || getchar() != '\n') {
printf ("Try again!\n");
}
}
改变了代码结构,改变了循环条件和循环体,但仍然是多次输入或一次运行。
#include <stdio.h>
int main() {
char c;
int input = 0, loopvariable = 1, number, secondtolastfibo = 1, lastbuttwofibo = 1;
long lastfibo;
printf ("Fibonacci-Numbers\n"
"How many Fibonacci do you want? ");
while (input != 1 || getchar() != '\n') {
while ((c = getchar()) != '\n' && c != EOF) { }
input = scanf ("%d", &number);
if (input != 1 || getchar() != '\n') {
printf ("Try a positive number!\n");
}
}
secondtolastfibo = 1;
lastbuttwofibo = 1;
printf ("%d. \t%d\n", loopvariable, secondtolastfibo);
loopvariable++;
printf ("%d. \t%d\n", loopvariable, secondtolastfibo);
while (loopvariable < number) {
fflush(stdin);
loopvariable++;
lastfibo = secondtolastfibo + lastbuttwofibo;
lastbuttwofibo = secondtolastfibo;
secondtolastfibo = lastfibo;
printf ("%d. \t%ld\n", loopvariable, lastfibo);
if (loopvariable % 10 == 0) {
printf ("Continue with Return.......");
getchar();
}
}
return 0;
}
输入和输出: 斐波那契数列 你想要多少个斐波那契数? 23 23
1
1
2
...
更改了循环条件:去掉了“while ((c = getchar()) != ' ' && c != EOF)" 或将循环条件更改为 (input !=1) 或将 input = scanf(...) 放在循环之外并将循环条件更改为 (input !=1) 但它不起作用并且仍然需要输入多次才能启动。
扫描集
%1[\n]
将扫描一个必须是换行符的字符。扫描将在输出中附加一个零,因此 char newline[2]
是所需的最小值。 %*[^\n]
将扫描并丢弃所有不是换行符的内容。
#include <stdio.h>
int main ( void) {
char newline[2] = "";
int input = 2, loopvariable = 1, number = 0, secondtolastfibo = 1, lastbuttwofibo = 1;
long lastfibo = 0;
printf ("Fibonacci-Numbers\n"
"How many Fibonacci do you want? ");
do {
if ( input != 2) {
scanf ( "%*[^\n]"); // scan and discard everything not a newline
printf ( "\tTry again\n");
}
input = scanf ("%d%1[\n]", &number, newline); // scan for integer and a newline
if (input == EOF) {
fprintf ( stderr, "EOF\n");
return 1;
}
} while (input != 2);
secondtolastfibo = 1;
lastbuttwofibo = 1;
printf ("%d. \t%d\n", loopvariable, secondtolastfibo);
loopvariable++;
printf ("%d. \t%d\n", loopvariable, secondtolastfibo);
while (loopvariable < number) {
loopvariable++;
lastfibo = secondtolastfibo + lastbuttwofibo;
lastbuttwofibo = secondtolastfibo;
secondtolastfibo = lastfibo;
printf ("%d. \t%ld\n", loopvariable, lastfibo);
if (loopvariable % 10 == 0) {
do {
printf ("Continue with Return.......");
scanf ( "%*[^\n]"); // scan and discard everything not a newline
input = scanf ( "%1[\n]", newline); // scan for one character that muse be a newline
if (input == EOF) {
fprintf ( stderr, "EOF\n");
return 1;
}
} while (input != 1);
}
}
return 0;
}