例如,给定文件中的这一行文本
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
我在这里做错了什么?
答案 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);