1

我有以下字符串

/foo123/bar123/card45/foofoo/1.3/

我想解析单词“card”后面的数字,在上面的示例中为 45。我应该为此使用 sscanf,如果是,我将如何去做?

谢谢

4

3 回答 3

3

我应该sscanf用于 [XYZ 问题]

不。

但是您可以使用strstrandstrtol代替:

const char *s = "/foo123/bar123/card45/foofoo/1.3/";
const char *p = "card";
const char *t = strstr(s, p);

int i = -1; // a negative number indicates a parse failure, for example
if (t != NULL) {
    t += strlen(p);
    char *end;
    i = strtol(t, &end, 10);
    if (!end || *end != '/') {
        // parsing the number failed
    }
}
于 2013-04-30T18:13:30.783 回答
2

使用strstr()后跟sscanf()将完成这项工作。假设您在字符数组中有源字符串source_string。然后使用:

char * ptr;
ptr = strstr(source_string,"card");

sscanf (ptr,"%*s %d",&number);  //Sorry this is wrong!!
sscanf(ptr,"card%d",&number);   //This is right!!
sscanf(ptr,"%*4s%d",&number);   //This works too


printf("The card number is %d",number);

strstr()获取“卡”开始的地址。然后将该地址sscanf()作为源传递。%*s读取“卡”但随后丢弃它。之后读取“卡”%d后面的数字并将其存储在整数变量number中,你然后使用printf().

于 2013-04-30T18:20:27.303 回答
0

使用简单的分割功能如何通过'/'切断你的路径?

这是我用来按特定字母拆分随机字符数组的函数。它将每个解析的部分保存到字符串向量中。

vector<string> split(const char *str, char c)

{
    vector<string> result;

    while(1)
    {
        const char *begin = str;

        while(*str != c && *str)
                str++;

        result.push_back(string(begin, str));

        if(0 == *str++)
                break;
    }

    return result;
}

所以,你可以像这样调用这个函数

vector<string> ParsedString;
ParsedString = split("Your/Random/path", '/');

然后,您可以访问 ParsedString 的每个索引以查看其中任何一个具有您要查找的特定单词。

或者,如果您要查找的单词始终位于从前面数第 3 或第 4 位,那么您只能选择那个进行搜索。

string InterestedTarget = ParsedString[4];
于 2013-04-30T18:20:54.240 回答