使用scanf在C语言中读取特定数量的字符?

3
我在从文本文件读取输入时遇到了问题。我的程序应该读取由用户指定的字符串,该字符串的长度在运行时确定。当用户手动输入值时,它可以正常工作,但是当我运行老师提供的文本文件时,它会陷入无限循环。
举个例子,在我要读入4个字符的情况下,他在文件中的输入是“ABCDy”。我应该读取“ABCD”,而“y”将在后面用于知道我应该重新开始游戏。但是,当我使用scanf读取“ABCD”时,它也会读取“y”。假设我在运行时不知道字符串的长度,是否有一种方法可以通过scanf解决这个问题?
4个回答

18

通常情况下,您可以使用像"%4c" 或者 "%4s" 这样的格式字符串来读取最多4个字符(不同之处在于"%4c" 无论如何都会读取接下来的4个字符,而"%4s" 会跳过前导空格并在遇到空格时停止)。

但是,如果要在运行时指定长度,则必须变得有点棘手,因为您无法在其中嵌入数字 "4" 的字符串字面量。一种替代方法是使用 sprintf 来创建要传递给 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);

考虑到 printfscanf 的格式字符串非常相似,人们可能认为在 scanf 中也可以使用相同的方式。不幸的是,这并不适用于 scanf -- 在转换说明符中,星号(*)表示一个应该被扫描但不进行转换的值。也就是说,它必须存在于输入中,但其值不会放置在任何变量中。


1

尝试

scanf("%4s", str)

它仍然在结尾读取y。而且我不知道这个值可能有多长。 - Kira

0

你也可以使用fread,其中你可以设置读取限制:

char string[5]={0};
if( fread(string,(sizeof string)-1,1,stdin) )
  printf("\nfull readed: %s",string);
else
  puts("error");

-2
你可以考虑简单地循环调用getc()

1
这就好比告诉想要精确画出80个像素的人调用80次putpixel函数。除了在学术和基准测试环境中,这两种做法都是不好的,因为你不是向服务器发送一个单一请求,而是向它发送任意数量的请求,每个请求的大小都比结果大。 - Dmytro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接