gpt4 book ai didi

c - 使用 scanf() 处理过度输入

转载 作者:太空宇宙 更新时间:2023-11-04 06:49:46 24 4
gpt4 key购买 nike

使用 scanf() 我想确保没有输入格式的确切内容。我的代码:

if (scanf("< %ld ; %ld > %c", &lo, &hi, &control) == 3)
{

}

我正在扫描 <0;100> s 形式的输入并想确保没有人能够输入类似 <0;100> sasdf 的内容(代表一个间隔),在这种情况下 scanf() 说这是可以的,因为它做了 3 次成功的转换并且没有抛出错误。我真的只想在间隔后扫描那个字符。我怎样才能做到这一点?

最佳答案

使用例如将输入读取为一行fgets() .然后使用 sscanf()尝试解析它:

char  buffer[1024];
char *line;
long lo, hi;
char control, dummy;

line = fgets(buffer, sizeof buffer, stdin);
if (!line) {
/* No input at all. */
exit(EXIT_FAILURE);
}

if (sscanf(line, " < %ld ; %ld > %c %c", &lo, &hi, &control, &dummy) == 3) {
/* Format is good, we have lo, hi, and control. */
} else {
/* Not this format; complain. */
}

注意最后的 %c前面应该有一个空格;这样,任何尾随空格(包括换行符)都会在最终 %c 之前被消耗掉.本质上,这是一种虚拟转换,当格式正确时不会发生;这也是我们期望结果为 3 而不是 4 的原因。当结果为 3 时,我们知道前三个转换成功,但第四个虚拟转换不成功,这显然意味着输入的格式正确,符合要求模式,线上没有任何其他内容。

这样,您还可以同时支持多种不同的格式。例如,

if (sscanf(line, " < %ld ; %ld > %c %c", &lo, &hi, &control, &dummy) == 3 ||
sscanf(line, " ( %ld %1*[,;] %ld ) %c %c", &lo, &hi, &control, &dummy) == 3 ||
sscanf(line, " %ld %ld %c %c", &lo, &hi, &control, &dummy) == 3) {
/* Format is good, we have lo, hi, and control. */
} else {
/* Not this format; complain. */
}

例如接受 <1;2>x , < 1 ; 2 > x , (3,4)y , (5;6)z , 7+8w9 10 c .

%1*[,;]部分很时髦:1表示最多接受一个字符。星号 *表示不算转换(在返回值中),不存储(所以没有相应的参数)。 [类型修饰符字符指定接受(或拒绝,如果 ^ 是第一个字符)字符列表,直到 ] .因此,用英语,我们可能会这样描述它:“接受一个逗号或一个分号,但不将其视为转换或存储它”。 (如果它是 %3*[,;/] ,那么它将是 “接受一到三个字符,其中每个字符是逗号、分号或斜杠”。对于这种情况非常有用。)

关于c - 使用 scanf() 处理过度输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53146851/

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