%s和%s%* c之间有什么区别[重复]

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

嗨,我正在阅读一些代码,此行已被使用:

scanf("%s%*c",dati[i].part);

%s%* c做什么,为什么不只使用%s?

c scanf
2个回答
0
投票

C0]调用中的[%*格式说明符”指示函数从输入缓冲区中读取following格式的数据(在您的情况下为scanf),但不要将其存储在任何位置(即丢弃它) )。

在您的特定情况下,c用于读取并丢弃尾随的[[newline字符(当用户按下%*c键时添加),否则将保留在输入中缓冲区,可能会打扰以后对Enter的所有调用。


0
投票
%s%* c做什么

scanf的含义与其他地方相同-跳过前导空格并将下一个非空格字符序列扫描到指定的字符数组中。

%s的含义与%*c相同-读取下一个输入字符,无论它是什么(

ie而不跳过前导空白)-除了%c内的含义是结果应不会在任何地方分配,因此应该没有相应的指针参数。同样,分配抑制意味着*的返回值不受该字段是否被成功扫描的影响。

为什么不只使用%s?

我们无法肯定地说出您看到它的代码的作者为什么使用scanf,除了不满意的“因为这是作者认为适当的”。我们根本没有任何其他判断的背景。

当然,实际效果是消耗字符串后的下一个输入字符(如果有)。如果存在这样的字符,则它必然是空白字符,否则它将被前面的%s%*c指令扫描。因此,我们可能

推测

作者的想法是消耗尾随的换行符。至少存在两个问题:

  1. 下一个字符可能不是换行符。例如,在换行符之前可能有尾随空格字符,在这种情况下,这些空格字符中的第一个将被占用,但换行符将保留在流中。如果是真正的问题,那么%s无法可靠解决。
  2. 实际上,它不是很有用。大多数%*c指令与scanf相似,因为它们会自动跳过前导空格,包括换行符。 %s仅在下一个要处理的指令是其中任何一个时才造成混淆。此外,%*c格式有可能明确表示应该跳过给定位置的空白行,并且如果下一个指令为其中一种不会自动跳过空格(实际上需要跳过空格)。

这并不意味着总体上抑制分配或scanf毫无用处,请记住。它只是试图使用该技术来尝试消耗构思不佳的尾随换行符。

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