C中“%[^ \ n]”和“%[^ \ n] \ n”和“%[^ \ n]%* c”之间的差异工作?

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

我在其他任何地方都找不到答案。

%[^\n]-运行此命令时,按Enter后,scanf正在获取输入并终止。 (可能将\n留在输入系统中)

%[^\n]\n-这是一个输入,但是我按上述输入后,scanf没有立即终止。我打了更多的回车,它使更多的新行。当我给一个字符然后按Enter时,它最终终止。例如:

int main(void)
{
    char s[100];

    scanf("%[^\n]\n", s);

    printf("%s", s);

    return 0;
}

结果:

enter image description here

上一个:

%[^\n]%*c-输入一些内容并按Enter键。 scanf立即终止。

这三者如何工作,它们有何不同?

c input scanf
1个回答
1
投票

全部3个都以"%[^\n]"开头。

"%[^\n]"是较差的代码2,它没有宽度限制,容易受到缓冲区溢出的影响。使用一个[[width限制,例如%99[^\n]char s[100];

该说明符指示读取输入,直到遇到'\n'

1。 '\n'被放回。所有其他字符都保存在匹配目标的数组s中。

如果未读取任何字符(不计算'\n'),则说明符失败,并且scanf()返回

无更改s。没有附加null character

如果读取了字符,则将它们保存,并在s后面附加一个

空字符

,并继续扫描格式的下一部分。
"\n"的行为与" ""\t"等类似,并且读取和抛弃0个或更多空白字符。它将继续这样做,直到读取了非空白

1。该非空白字符将重新放入stdout

给出行缓冲输入,这意味着需要跟随输入后的

line

才能看到下一个非空白。 使用scanf(),格式末尾的"\n"


"%*c"读取1个字符

1并将其丢弃。此说明符不影响返回计数。


更好的替代方法是使用fgets()

char s[100]; if (fgets(s, sizeof s, stdin)) { s[strcspn(s, "\n")] = '\0'; // To lop off potential trailing \n

较小的替代方法是

char s[100] = { 0 }; scanf("%99[^\n]", s); scanf("%*1[\n]"); // read the next character if it is a \n and toss it.


1

...或文件结尾或罕见输入错误。

2

IMO,比gets()差。
© www.soinside.com 2019 - 2024. All rights reserved.