如何使用sscanf从一行文本中解析单个单词

时间:2016-01-31 21:35:20

标签: c scanf

例如,给定文件中的这一行文本

Today: Wed @2p,@3p,5

我如何使用sscanf获得“@ 2p”?现在我正在使用这段代码:

char 1st[3];
char 2nd[3];
int num;

sscanf(str,"%*[^:]%*[^\t]%s,%s,%d", 1st, 2nd, &num);
printf("1st = %s\n", 1st);
printf("2nd = %s\n", 2nd);
printf("num = %s\n", &num);

,输出

1st = Wed
2nd = 'empty characters'
num = 'empty characters'Wed

我在这里做错了什么?

2 个答案:

答案 0 :(得分:1)

以下内容失败,因为"%*[^:]"扫描"Today",然后"%*[^\t]" ":"扫描,"%s"扫描并且未保存"\t",继续扫描并将"Wed"保存到太小的数组中,导致未定义的行为。

sscanf("Today:\tWed @2p,@3p,5", "%*[^:]%*[^\t]%s,%s,%d", 1st, 2nd, &num);

以下内容失败,因为"%*[^:]"扫描"Today",然后"%*[^\t]"": Wed @2p,@3p,5"进行扫描,不为"%s"留下任何内容。它也不会检查sscanf()的结果。始终检查结果以确保有效结果。

sscanf("Today: Wed @2p,@3p,5", "%*[^:]%*[^\t]%s,%s,%d", 1st, 2nd, &num);

进一步"@2p"无法放入char [3]数组中。空字符需要空间。

确定可接受字符的构成: scanset 和最大字符数。检查结果

#define Word_Max 3
#define Prefix "%*[^@]"
#define ScanSet "%3[A-Za-z0-9@]"

char *str = "Today: Wed @2p,@3p,5";
char word[2][Word_Max + 1];
int num;

if (3 == sscanf(str, Prefix ScanSet "," ScanSet ",%d", word[0], word[1], &num)) {
  printf("'%s' '%s' %d\n", word[0], word[1], num);
} else {
  puts("Fail");
}

输出

'@2p' '@3p' 5

答案 1 :(得分:0)

我猜你的%*[^\t]"吃掉了#34;只是%*[^:]留下的分号。所以:
%*[^:]%获得Today *[^\t]%获得: %s获得Wed 并且因为在Wed之后没有逗号,所以%s后面没有任何内容

以下代码将在char数组中获取@2p

sscanf(str, "%*[^@]%[^,]", 1st);