我无法接受来自文本文件的输入。我的程序应该读入用户指定的字符串,并且该字符串的长度是在运行时确定的。当用户运行程序(手动输入值)时,它工作正常,但是当我运行教师的文本文件时,它会进入无限循环。
对于这个例子,当我输入4个字符并且他的文件中的输入是“ABCDy”时,它失败了。 “ABCD”是我应该阅读的内容,而'y'应该在以后用来知道我应该重新启动游戏。相反,当我使用scanf读入“ABCD”时,它也会读入'y'。有没有办法绕过这个使用scanf,假设我不知道字符串应该运行多长时间?
答案 0 :(得分:15)
通常情况下,您使用"%4c"
或"%4s"
之类的内容最多可以读取4个字符(不同之处在于,"%4c"
会读取接下来的4个字符,而"%4s"
则会sprintf
1}}跳过前导空格,如果有空格则停在空白处。
但是,要在运行时指定长度,您必须更加棘手,因为您不能使用嵌入了“4”的字符串文字。另一种方法是使用scanf
创建您传递给char buffer[128];
sprintf(buffer, "%%%dc", max_length);
scanf(buffer, your_string);
的字符串:
printf
我应该添加:使用*
,您可以通过在格式字符串中放置星号(int width = 10;
int precision = 7;
double value = 12.345678910;
printf("%*.*f", width, precision, value);
)并将变量放在适当的位置来动态指定字段的宽度或精度指定宽度/精度:
printf
鉴于scanf
和scanf
格式字符串非常相似,人们可能会认为同样适用于scanf
。不幸的是,情况并非如此 - 转换规范中的{{1}}星号表示应扫描但未转换的值。也就是说,输入中必须存在的东西,但它的值不会放在任何变量中。
答案 1 :(得分:0)
尝试
scanf("%4s", str)
答案 2 :(得分:0)
您也可以使用fread,您可以在其中设置读取限制:
char string[5]={0};
if( fread(string,(sizeof string)-1,1,stdin) )
printf("\nfull readed: %s",string);
else
puts("error");
答案 3 :(得分:-1)
您可以考虑简单地循环调用getc()。