sscanf坏了吗?
我正在尝试解析格式为sscanf坏了吗?,c,scanf,C,Scanf,我正在尝试解析格式为1..4的字符串,我不想将它们解析为字符串,它们可以是任何东西 但是,使用sscanf: char *str = "1..4"; char a[128]; char b[128]; int c = sscanf(str, "%s..%s", a, b); printf("a=%s, b=%s, c=%d\n", a, b, c); 提供以下输出: a=1..4, b=��, c=1 是否只解析一个字符串?我是做错了什么,还是这是sscanf中的错误? 如果我去掉这些点:
1..4
的字符串,我不想将它们解析为字符串,它们可以是任何东西
但是,使用sscanf
:
char *str = "1..4";
char a[128];
char b[128];
int c = sscanf(str, "%s..%s", a, b);
printf("a=%s, b=%s, c=%d\n", a, b, c);
提供以下输出:
a=1..4, b=��, c=1
是否只解析一个字符串?我是做错了什么,还是这是sscanf
中的错误?
如果我去掉这些点:
char *str = "1 4";
char a[128];
char b[128];
int c = sscanf(str, "%s %s", a, b);
printf("a=%s, b=%s, c=%d\n", a, b, c);
我得到:
a=1, b=4, c=2
这就是我在第一个例子中所期望的
文档中的
未指定为格式字符
将格式字符串改为解析为整数也可以:
char *str = "1..4";
int a;
int b;
int c = sscanf(str, "%d..%d", &a, &b);
printf("a=%d, b=%d, c=%d\n", a, b, c);
给出:
a=1, b=4, c=2
%s
说明符在看到第一个非前导空格时停止读取。文档中有说明(向下滚动至“s”行):
任意数量的非空白字符,在找到的第一个空白字符处停止。将在存储序列的末尾自动添加终止空字符
%s
说明符在看到第一个非前导空格时停止读取。文档中有说明(向下滚动至“s”行):
任意数量的非空白字符,在找到的第一个空白字符处停止。将在存储序列的末尾自动添加终止空字符
%s
在第一个空格处终止,忽略任何其他格式字符
相反,我应该使用%[^.]
来读取所有字符,直到
:
char *str = "1..4";
char a[128];
char b[128];
int c = sscanf(str, "%[^.]..%s", a, b);
printf("a=%s, b=%s, c=%d\n", a, b, c);
它给出了预期的行为:
a=1, b=4, c=2
%s
在第一个空格处终止,忽略任何其他格式字符
相反,我应该使用%[^.]
来读取所有字符,直到
:
char *str = "1..4";
char a[128];
char b[128];
int c = sscanf(str, "%[^.]..%s", a, b);
printf("a=%s, b=%s, c=%d\n", a, b, c);
它给出了预期的行为:
a=1, b=4, c=2
在
sscanf()
中使用%s
的手册如下:
匹配一系列非空白字符;下一个指针必须是指向字符数组的指针,该数组的长度足以容纳输入序列和自动添加的终止空字节('\0')。输入字符串在空白处或最大字段宽度处停止,以先出现的为准
如果不向sscanf()
提供有关您试图提取的字符串的性质的更具体信息,您试图做的事情就不能简单地使用sscanf(“%s”)
我的建议是,由于您不希望第一个扫描的参数包含任何句点,因此请使用sscanf(“%[]”)转换来指定不允许的内容:
从指定的接受字符集中匹配非空字符序列;下一个指针必须是指向char的指针,并且必须有足够的空间容纳字符串中的所有字符,以及一个终止的空字节。通常前导空白的跳过被抑制。字符串由特定集合中(或不在特定集合中)的字符组成;集合由开括号[字符和闭括号]字符之间的字符定义。如果左括号后的第一个字符是扬抑符(^),则该集将排除这些字符。要在集合中包含一个右括号,请使其成为左括号或扬抑符后的第一个字符;任何其他位置都将结束设置。连字符-也很特殊;当放置在其他两个字符之间时,它会将所有中间字符添加到集合中。要包含连字符,请将其设置为最后一个右括号前的最后一个字符。例如,[^]0-9-]表示集合“除右括号、0到9和连字符外的所有内容”。字符串以字符不在(或带扬抑符的in)集中或字段宽度用完时的外观结束
如果您知道愿意接受任何不包含句点的字符串,请尝试以下排除句点的操作:
char *str = "1..4";
char a[128];
char b[128];
int c = sscanf(str, "%[^.]..%s", a, b);
printf("a=%s, b=%s, c=%d\n", a, b, c);
在sscanf()
中使用%s
的手册如下:
匹配一系列非空白字符;下一个指针必须是指向字符数组的指针,该数组的长度足以容纳输入序列和自动添加的终止空字节('\0')。输入字符串在空白处或最大字段宽度处停止,以先出现的为准
如果不向sscanf()
提供有关您试图提取的字符串的性质的更具体信息,您试图做的事情就不能简单地使用sscanf(“%s”)
我的建议是,由于您不希望第一个扫描的参数包含任何句点,因此请使用sscanf(“%[]”)转换来指定不允许的内容:
从指定的接受字符集中匹配非空字符序列;下一个指针必须是指向char的指针,并且必须有足够的空间容纳字符串中的所有字符,以及一个终止的空字节。通常前导空白的跳过被抑制。字符串由特定集合中(或不在特定集合中)的字符组成;集合由开括号[字符和闭括号]字符之间的字符定义。如果左括号后的第一个字符是扬抑符(^),则该集将排除这些字符。要在集合中包含一个右括号,请使其成为左括号或扬抑符后的第一个字符;任何其他位置都将结束设置。连字符-也很特殊;当放置在其他两个字符之间时,它会将所有中间字符添加到集合中。要包含连字符,请将其设置为最后一个右括号前的最后一个字符。例如,[^]0-9-]表示集合“除右括号、0到9和连字符外的所有内容”。字符串以字符不在(或带扬抑符的in)集中或字段宽度用完时的外观结束
如果您知道愿意接受任何不包含句点的字符串,请尝试以下排除句点的操作:
char *str = "1..4";
char a[128];
char b[128];
int c = sscanf(str, "%[^.]..%s", a, b);
printf("a=%s, b=%s, c=%d\n", a, b, c);