gpt4 book ai didi

c - scanf: "%[^\n]"跳过第二个输入但 "%[^\n]"没有。为什么?

转载 作者:太空狗 更新时间:2023-10-29 16:23:22 26 4
gpt4 key购买 nike

考虑以下代码:

#include <stdio.h>

int main (void)
{
char str1[128], str2[128], str3[128];

printf ("\nEnter str1: ");
scanf ("%[^\n]", str1);
printf ("\nstr1 = %s", str1);

printf ("\nEnter str2: ");
scanf ("%[^\n]", str2);
printf ("\nstr2 = %s", str2);

printf ("\nEnter str3: ");
scanf ("%[^\n]", str3);
printf ("\nstr3 = %s", str3);

printf ("\n");
return 0;
}

当它被执行时,只有第一个 scanf 会因提示而停止。该程序不会为下一个 scanf 停止。但是如果把格式字符串从"%[^\n]"改成"%[^\n]"(注意%<之前的空格),那么它就可以正常工作。是否自动接受了先前输入缓冲区中的某些现有换行符?但是刷新 stdin 并不能解决这个问题。

这是什么原因。

最佳答案

您只需要在阅读完想要的内容后“消费”'\n' 字符即可。使用以下格式指令:

"%[^\n]%*c"

这会将换行符之前的所有内容读入您传入的字符串中,然后将使用单个字符(换行符)而不将其分配给任何内容('*' 是“赋值抑制” ).

否则,换行符将留在输入流中,等待立即终止后续的 "%[^\n]" 格式指令。

将空格字符添加到格式指令 ("%[^\n]") 的问题在于空格将匹配任何 空格。因此,它会吃掉上一个输入末尾的换行符,但它也会吃掉任何其他空格(包括多个换行符)。

更新您的示例:

  char* fmt = "%[^\n]%*c";

printf ("\nEnter str1: ");
scanf (fmt, str1);
printf ("\nstr1 = %s", str1);

printf ("\nEnter str2: ");
scanf (fmt, str2);
printf ("\nstr2 = %s", str2);

printf ("\nEnter str3: ");
scanf (fmt, str3);
printf ("\nstr2 = %s", str3);

printf ("\n");

关于c - scanf: "%[^\n]"跳过第二个输入但 "%[^\n]"没有。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6083045/

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