如何返回上一个scanf并保持流程

时间:2016-07-30 22:01:35

标签: c return

我正在为一个仍处于测试版的水疗中心编写此代码(个人软件),但我遇到的问题更像是一个想法,而不是让我向您解释的问题:

源代码:

    fflush(stdin);
    gets(NC1.Customer_Nameandlastname);
    fflush(stdin);
    printf("provide the customer's age\n\t");

    fflush(stdin);
    scanf("%d",&NC1.Customer_Age);
    fflush(stdin);

这只是源代码的一部分,但我在程序运行时想要做的是:

如果输入信息的人犯了错误或者想要重新输入相同的信息,但是下一个命令行已经在等待输入数据那么问题是我该如何回到上一行然后我完成后继续下一行? 因此,如果我已经输入了该信息,然后系统正在等待下一行,那么我将如何返回上一个scanf()。 请帮助我,因为我真的不知道你在做什么,我仍然无法找到它。但是我仍然无法找到它。

3 个答案:

答案 0 :(得分:1)

您无法使用stdinfflush(stdin);移植刷新输入。它调用未定义的行为。

您可以使用此功能从stdin读取其他违规行:

void flush_line(FILE *fp) {
    int c;
    while ((c = getc(fp)) != EOF && c != '\n')
        continue;
}

此外,请勿使用gets()。这种不安全的功能(您无法提供目标阵列的大小,因此任何正确制作的输入都可能导致未定义的行为,攻击者可以使用这个漏洞来破坏您的程序)。该函数最终于2011年从C标准中删除。使用fgets()并删除尾随换行符,如果有这样的话:

if (fgets(line, sizeof line, stdin)) {
    line[strcspn(line, "\n")] = '\0';
    ...
}

您无法重新启动失败的scanf()。返回值为您提供有关失败位置的一些信息,但不足以可靠地重新启动解析。解析标准输入的更好方法是逐行读取并使用sscanf()来解析行。例如:

/* read the customer's age.  Keep prompting in case of invalid input */
for (;;) {
    char line[80];

    printf("provide the customer's age\n\t");

    /* force flush of stdout for systems that do not do it
       automatically upon reading from stdin */
    fflush(stdout);

    if (!fgets(line, sizeof line, stdin)) {
        /* end of file reached */
        return -1;
    }
    if (sscanf(line, "%d", &NC1.Customer_Age) == 1) {
        /* input parsed correctly, break out to the next question */
        break;
    }
    /* parse failed, output an appropriate message and restart */
    printf("bad input, please type a number\n");
}

答案 1 :(得分:0)

这确实是一个基本问题,你想要的是像这样的循环

while (fgets(buffer, SIZE_OF_BUFFER, stdin) != NULL) {
    if (is_input_valid(buffer) == 1)
        break;
    /* Or else, go again */
}

答案 2 :(得分:0)

询问用户所有细节后,请询问

  

您要将此记录存储在数据库中吗?

告诉用户如果他犯了错误,他应该为以下字段输入垃圾,并回答“不,我想丢弃此记录”。

也许用户会自己理解这是他应该做的,因为要求这样的确认是一种非常标准的做法。