C 中的否定扫描集技术

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

我正在尝试对 scanf 使用否定扫描集技术(我不允许使用其他任何东西,所以不

getchar()
)。

但是我有一个小问题。

当我使用

scanf(“%*[ \n]%*c”)
时。 如果我输入像 4(空格!)4 这样的输入 由于某种原因它不会清理缓冲区?第二个 4 仍然在那里:(因此它打印了我的错误消息两次

我尝试实现

%*[^ ]
,但在像 45 这样没有空格的情况下它会破坏代码,因此不会继续运行代码,只是卡在 scanf 上

卡住是指没有收到我想要打印的错误消息;相反,我需要继续输入数字/字符串,直到它决定弹出

我真的不知道该怎么办。 我没有在这里实现我的代码,因为我把它全部删除了。

只是一个简单的整数 scanf 同时(1) 如果 scanf 的结果不是 2 则打印错误消息 使用否定的 scanf 扫描成整数

如果是2个爆发。

ChatGPT、YouTube、Reddit、Google,甚至在这里

从字面上看,什么都没有……从我读到的内容来看,我所做的应该有效,但事实并非如此,而且 我真的不知道为什么。

c if-statement while-loop printf scanf
1个回答
0
投票

基本问题是scanf扫描集(无论是否否定)匹配1个或更多个字符,当没有这个字符时将无法匹配。

因此模式

"%*[ \n]%*c"
将匹配一个或多个空格或换行符,后跟任何一个字符。 如果输入中的下一个字符不是空格或换行符,它将失败并且不匹配任何内容。

因此,如果您想忽略可能存在或不存在的某些内容,则扫描集仅在它本身位于 scanf 中时才有效。 因此,如果您想读取 2 个非空字符,并在使用扫描集之前和之间使用可选空格,则需要类似以下内容:

scanf("%*[ ]");
scanf("%c", &char1);
scanf("%*[ ]");
scanf("%c", &char2);

对 scanf 进行四次单独的调用——如果没有空格,那么这些 scanf 调用将失败,但不会消耗任何内容。

scanf 中唯一可能的“零个或多个”匹配是在使用空格时——这将匹配零个或多个空格、制表符或换行符。 因此,如果您想要两个非空白字符同时跳过空白,您可以使用

scanf(" %c %c", &char1, &char);

但这仅在您要跳过的是
any
空白(任何空格、制表符或换行符)并且不关心不同类型的空白之间的差异时才有效。

一般来说,您还应该检查 scanf 的返回值——否则您可能会得到意外的文件结尾。

© www.soinside.com 2019 - 2024. All rights reserved.