gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:44:10 24 4
gpt4 key购买 nike

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

源代码:

    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()。请帮助我,因为我真的不知道你在做什么我正在寻找如何去做,但我仍然找不到它。

最佳答案

您不能使用fflush(stdin); 移植地flush 来自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");
}

关于c - 如何返回到上一个 scanf 并保持流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38678877/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com