我试图在一个小程序中多次使用scanf
来获取保证有空格的输入。 从我浏览的多个线程看起来像scanf("%[^n]", string);
是让它忽略空间的方法。 这适用于一行,但该行之后的任何其他scanf都没有通过,它们各自的字符串显示如下:
Action: J J Resolution: J:F J B J
这是一些我认为可行的示例代码,但没有。
#include int main(void) { char str1[100]; char str2[100]; printf("Situation?n"); scanf("%[^n]", str1); printf("Action Taken?n"); scanf("%[^n]", str2); printf("Situation: %sn",str1); printf("Action: %sn",str2); }
如果在提示输入情况时输入“Just a test”,则会发生以下情况:
Situation? just a test Action Taken? Situation: just a test Action: _ ? JN= J J d J0d 8d TJ J
任何建议或解决方案(不包括fgets
)? 对正在发生的事情的解释也会很棒。
编辑: scanf上的解决方案:“%[^ n]”跳过第二个输入,但“%[^ n]”没有。 为什么?
添加char* fmt = "%[^n]%*c";
100%工作。
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");
更改
scanf("%[^n]", str1);
至
scanf("%[^n]%*c", str1);//consume a newline at the end of the line
方法数量:
而不是以下不消耗Enter或'n'
(这是问题):
scanf("%[^n]",str1);
无论采用何种解决方案,都要限制读取的最大字符数并检查函数的返回值。
if (fgets(str1, sizeof str1, stdin) == NULL) Handle_EOForIOError();
我没有立即回答您的问题,如果您想要一行输入,为什么不简单地使用fgets (甚至获取 )?
解决方案一:使用scanf
如果您仍想通过scanf
读取它,@ chux和@BLUEPLXY提供的答案就足够了。 喜欢:
scanf(" %[^n]", str); //notice a space is in the formatted string
要么
scanf("%[^n]%*c", str);
解决方案二:使用getline()
(虽然它是POSIX扩展)
因为使用gets()
和’fgets()`有时是不可靠的。
以上就是c/c++开发分享在C中使用多个scanf时,使用scanf忽略空格的问题相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/519823.html