Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sscanf坏了吗?_C_Scanf - Fatal编程技术网

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);