嗨,我正在阅读一些代码,此行已被使用:
scanf("%s%*c",dati[i].part);
%s%* c做什么,为什么不只使用%s?
C0]调用中的[%*
格式说明符”指示函数从输入缓冲区中读取following格式的数据(在您的情况下为scanf
),但不要将其存储在任何位置(即丢弃它) )。
在您的特定情况下,c
用于读取并丢弃尾随的[[newline字符(当用户按下%*c
键时添加),否则将保留在输入中缓冲区,可能会打扰以后对Enter
的所有调用。
%s%* c做什么
scanf
的含义与其他地方相同-跳过前导空格并将下一个非空格字符序列扫描到指定的字符数组中。
%s
的含义与%*c
相同-读取下一个输入字符,无论它是什么(
ie而不跳过前导空白)-除了%c
内的含义是结果应不会在任何地方分配,因此应该没有相应的指针参数。同样,分配抑制意味着*
的返回值不受该字段是否被成功扫描的影响。
为什么不只使用%s?
我们无法肯定地说出您看到它的代码的作者为什么使用scanf
,除了不满意的“因为这是作者认为适当的”。我们根本没有任何其他判断的背景。
当然,实际效果是消耗字符串后的下一个输入字符(如果有)。如果存在这样的字符,则它必然是空白字符,否则它将被前面的%s%*c
指令扫描。因此,我们可能
推测
作者的想法是消耗尾随的换行符。至少存在两个问题:%s
无法可靠解决。%*c
指令与scanf
相似,因为它们会自动跳过前导空格,包括换行符。 %s
仅在下一个要处理的指令是其中任何一个时才造成混淆。此外,%*c
格式有可能明确表示应该跳过给定位置的空白行,并且如果下一个指令为其中一种不会自动跳过空格(实际上需要跳过空格)。这并不意味着总体上抑制分配或scanf
毫无用处,请记住。它只是试图使用该技术来尝试消耗构思不佳的尾随换行符。