你有几个问题。zubergu在他的回答中正确诊断了两个:(1) 在需要 a 的char *
地方传递 a char **
(请参阅scanf()
),以及 (2) 尝试覆盖您正在扫描的字符串,该字符串首先是只读的,并且在任何情况下都会调用未定义的行为。
另一个是您没有检查退货状态sscanf()
。你可能需要这样的东西:
char *p = "select ?Y ?Z where condition";
char *array[2];
p += strlen("select");
for (int i = 0; i < 2; i++)
{
int offset;
if (sscanf(p, " %m[?a-zA-Z]%n", &array[i], &offset) != 1)
...report error and break loop...
printf("%s, ", array[i]);
p += offset;
}
请注意转换规范之前的空白以跳过前导空格。
如果您有sscanf()
支持该符号的版本,则此代码应该可以正常工作:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
char *p = "select ?Y ?Z where condition";
char *array[2] = { 0, 0 };
int i;
int j;
p += strlen("select");
for (i = 0; i < 2; i++)
{
int offset;
printf("p = <<%s>>\n", p);
if (sscanf(p, " %m[?a-zA-Z]%n", &array[i], &offset) != 1)
break;
printf("%d: <<%s>> (offset = %d)\n", i, array[i], offset);
p += offset;
}
printf("%d: all done\n", i);
for (j = 0; j < i; j++)
free(array[j]);
return 0;
}
Mac OS X 10.9 不支持m
修饰符;旧版本的 Linux 也没有(自我注意:必须更新可用的虚拟机)。在 Ubuntu 12.04 衍生版本上进行测试时,我得到了输出:
p = << ?Y ?Z where condition>>
0: <<?Y>> (offset = 3)
p = << ?Z where condition>>
1: <<?Z>> (offset = 3)
2: all done