我正在尝试使用正则表达式分隔一串数字。当数字用逗号分隔时,以下C代码有效:
#include <stdio.h>
int main()
{
char *multiple = "0.20,0.37,0.75,0.56";
char one[4];
char two[4];
char three[4];
char four[4];
sscanf(multiple, "%[^','], %[^','], %[^','], %[^',']", one, two, three, four);
printf("one %s, two %s, three %s, four %s\n", one, two, three, four);
return 0;
}
然而,在我的代码中,它们用分号分隔,我想做同样的事情。只是,它在这种情况下不起作用:
#include <stdio.h>
int main()
{
char *multiple = "0.20;0.37;0.75;0.56";
char one[4];
char two[4];
char three[4];
char four[4];
sscanf(multiple, "%[^';'], %[^';'], %[^';'], %[^';']", one, two, three, four);
printf("one %s, two %s, three %s, four %s\n", one, two, three, four);
return 0;
}
任何人都可以让我知道为什么会这样,以及如何解决它?
答案 0 :(得分:2)
scanf不支持正则表达式。它支持给定字符集的字符串。当您的格式包含%[^';']
时,它会匹配 '
和;
之外的任何一个或多个字符的序列。当您的格式包含逗号(,
)时,它会与逗号匹配。
所以当你说:
sscanf(multiple, "%[^';'], %[^';'], %[^';'], %[^';']", one, two, three, four);
它尽可能匹配'
和;
以外的其他字符,并将其存储在one
中。然后它尝试匹配,
,这将失败(导致scanf返回1 - 匹配和存储的一件事),因为任何逗号都包含在one
中 - 下一个字符只能是;
或'
。
你想要的是
if (sscanf(multiple, "%[^;];%[^;];%[^;];%[^;]", one, two, three, four) != 4)
/* failed -- do something appropriate */
您应该始终检查scanf的返回值,看它是否与您的所有模式匹配,并抓住了您认为应该的数量。
另请注意格式中缺少空格 - 空格将匹配(并跳过)字符串中0个或更多空白字符的任何序列。这实际上可能就是你想要的(在你提取的每个字段中去除前导空格),但不是你所描述的那样
答案 1 :(得分:1)
使用分号执行与注释相同的操作
sscanf(multiple, "%[^';'];%[^';'];%[^';'];%[^';']", one, two, three, four);
为什么,我不知道,因为scanf系列函数中的格式说明符通常不被认为是正则表达式。我不知道有关scanf功能的所有细节。
答案 2 :(得分:0)
在这里,这应该有效:
#include <stdio.h>
int main()
{
char * multiple("0.20,0.37,0.75,0.56");
char one[10];
char two[10];
char three[10];
char four[10];
sscanf(multiple, "%[^';'];%[^';'];%[^';'];%[^';']", one, two, three, four);
printf("one %f, two %f, three %s, four %s\n", one, two, three, four);
return 0;
}