首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当这个格式字符串与fscanf配对时,它到底是做什么的?

当这个格式字符串与fscanf配对时,它到底是做什么的?
EN

Stack Overflow用户
提问于 2021-12-01 06:24:40
回答 3查看 175关注 0票数 1

我正在看一些代码,并碰到了这一行:

代码语言:javascript
复制
fscanf(file, "%*[: ]%16s", dest);

%*[: ]%16s格式字符串说明符是做什么的?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-12-01 06:41:56

此格式字符串

代码语言:javascript
复制
"%*[: ]%16s"

这意味着必须在输入流中跳过所有符号':'' ' (放置在格式字符串方括号中的符号),然后在字符数组中最多读取16个字符。

在格式字符串中,符号*是赋值抑制字符.

这是一个演示程序。对于可见性,我使用的是sscanf而不是fscanf

代码语言:javascript
复制
#include <stdio.h>

int main( void ) 
{
    const char *stream = "::: : : : :::Hello";
    char s[17];
    
    sscanf( stream, "%*[: ]%16s", s );
    
    printf( "\"%s\"\n", s );

    return 0;
}

程序输出是

代码语言:javascript
复制
"Hello"
票数 4
EN

Stack Overflow用户

发布于 2021-12-01 07:05:00

它读取任何空格或: (冒号)字符,然后丢弃它们,然后将多达16个非空格字符读入dest (包括空终止符\0)。

*后面的%是“赋值抑制字符”。%s之间的数字是“最大字段宽度”。方括号表示与内部字符或除这些字符(用插入符号)以外的所有字符匹配。破折号和插入符号是专门处理的。

从Linux的手册中获得scanf:

每种格式的转换规范都以字符'%‘或字符序列"%n$“(区别见下文)开头,然后是: ·一个可选的“*”赋值-抑制字符: scanf()按转换规范的指示读取输入,但放弃输入。不需要相应的指针参数,该规范也不包含在scanf()返回的成功赋值计数中。剪辑 ·一个可选的十进制整数,它指定最大字段宽度。当达到此最大值或找到不匹配字符时,字符的读取将停止,以先发生者为准。大多数转换都会丢弃初始空白字符(下面会注意到这些例外情况),并且这些丢弃字符不计入最大字段宽度。字符串输入转换存储一个终止空字节('\0')来标记输入的结束;最大字段宽度不包括此终止符。可以使用下列转换说明符: 剪辑 匹配一个非空白字符序列;下一个指针必须是指向字符数组的初始元素的指针,该元素足够长,足以容纳输入序列和自动添加的终止空字节('\0')。输入字符串以空白或最大字段宽度(以先发生者为准)停止。 剪辑 [匹配指定的一组可接受字符的非空字符序列;下一个指针必须是指向字符的指针,并且必须有足够的空间容纳字符串中的所有字符,加上一个终止空字节。通常的前导空格跳过是被抑制的。字符串由(或不在)特定集合中的字符组成;该集合由开括号字符和结束括号字符之间的字符定义。如果开括号后的第一个字符是回旋(^),则集合将排除这些字符。若要在集合中包含一个近括号,请将其设置为在开括号或旋转框之后的第一个字符;任何其他位置都将结束该集合。连字符-也是特殊的;当放在另外两个字符之间时,它会将所有中间的字符添加到集合中。若要包含连字符,请将其作为最后一个结束括号之前的最后一个字符。例如,^0-9-]指的是“除近括号、零到九和连字符以外的所有内容”。字符串的结尾是一个字符的外观,而不是在(或者,用旋旋器,in)集中,也不是在字段宽度用完时。

- Linux 扫描量(3)手册

票数 2
EN

Stack Overflow用户

发布于 2021-12-01 12:33:43

"%*[: ]%16s"格式字符串说明符是做什么的?

  1. "%*[: ]":读取和丢弃(由于"*") -- scan_set的输入字符至少有一个':'' '。如果没有':'' '找到,停止扫描。
  2. "%16s"有三个步骤: 1)读取和丢弃任何(0或更多)前导空格。例如' ''\n''\t'等2)读取并保存到dest 至少一个,但不超过16个非空白-否则停止扫描。3)在dest中追加空字符。因此,dest至少应该是17:char dest[16+1];

高级

fscanf()sscanf()的一个奇怪的区别是,当sscanf()读取空字符时,扫描停止。使用fscanf(),扫描继续进行。

使用fscanf(file "%s", dest)'\t''1''2''3''\0''x''y''z'dest[]'1''2''3'D48、D49、'y'、'z'、D 52的8个字符文件数据。在文本文件中有一个空字符是不寻常的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70179908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档