VS代码需要多次输入

问题描述 投票:0回答:1

我使用循环来确定输入是否正确,如果错误则再次询问,直到输入有效为止,程序确实会运行,但我必须多次输入数字。如果我在另一台机器上运行代码,它只需第一个输入即可顺利运行。 这是一个示例,但无论我选择什么循环,它都是相同的。

  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.  1
    
  3.  2
    

...

更改了循环条件:去掉了“while ((c = getchar()) != ' ' && c != EOF)" 或将循环条件更改为 (input !=1) 或将 input = scanf(...) 放在循环之外并将循环条件更改为 (input !=1) 但它不起作用并且仍然需要输入多次才能启动。

c loops visual-studio-code
1个回答
0
投票

扫描集

%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;
}
© www.soinside.com 2019 - 2024. All rights reserved.