我有一个包含多行的字符串,我想使用sscanf来匹配它的特定部分.然而,它似乎只适用于第一行中包含的匹配数据.
例如,如果我有字符串:
"age1:x\r \n age2:x"
并使用sscanf:
sscanf(string,"age1:%d",&i); - 这适用于
sscanf(字符串,"age2:%d",&j); - 但事实并非如此.
有任何想法吗?
正如其他人所指出的,sscanf不记得有多少数据读取和推进,如输入数据scanf和fscanf做.使用说明%n符记住读取了多少数据,并自行推进输入:
int bytesRead;
if(sscanf(string, "age 1: %d\n%n", &i, &bytesRead) == 1) &&
sscanf(string + bytesRead, "age 2: %d", &j) == 1)
{
// success
}
else
{
// parsing failed
}
Run Code Online (Sandbox Code Playgroud)
该%n说明符说,"告诉我怎么输入的字节数已经读了这一点,并将其存储在一个参数(必须是一个指针int)".通过将它放在格式字符串的末尾,我们可以计算出解析了多少输入.还要注意我之后添加了一个换行符,%d以便我们在第一个整数之后吃掉空格; 否则,当我们尝试阅读时"age 2",它会看到下一行而不是字符a,并且解析会失败,因为那不是匹配.