【发布时间】:2014-08-18 23:46:12
【问题描述】:
我试图在一个小程序中多次使用scanf 来获取保证有空格的输入。从我浏览过的多个线程来看,scanf("%[^\n]", string); 似乎是让它忽略空格的方法。这适用于一行,但该行之后的任何其他 scanf 都不会通过,并且它们各自的字符串会输出以下内容:
Action: J���J
Resolution: J:F�J�B�J
下面是一些我认为可行的示例代码,但没有。
#include <stdio.h>
int main(void)
{
char str1[100];
char str2[100];
printf("Situation?\n");
scanf("%[^\n]", str1);
printf("Action Taken?\n");
scanf("%[^\n]", str2);
printf("Situation: %s\n",str1);
printf("Action: %s\n",str2);
}
如果我在提示情况时输入“只是一个测试”,则会发生以下情况:
Situation?
just a test
Action Taken?
Situation: just a test
Action: ��_��?�J.N=��J�J�d�����J0d���8d��TJ�J
有什么建议或解决方案(不包括fgets)?对正在发生的事情进行解释也很好。
编辑:解决方案在scanf: "%[^\n]" skips the 2nd input but " %[^\n]" does not. why?
添加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");
【问题讨论】:
-
[说明符必须找到至少 1 个字符,否则匹配失败。你会发现scanf在这种情况下返回0(你应该总是检查scanf的返回值)然后你使用未初始化的变量str2导致未定义的行为。