如何预期不同数量的空格 sscanf

问题描述 投票:0回答:1

我正在尝试使用 sscanf 解析一个大的代理 txt 文件(即包含代理信息(ip、端口、协议...)的文件),并且遇到了以下问题:其中的 IP 地址不属于相同长度的行会留下不同的空格,如示例所示:

72.210.221.197  4145    Socks5  United States   Elite   932ms   93.8%   10 minutes
176.98.90.20    8080    HTTP    Ukraine Elite   183ms   77.3%   4 minutes

ip 和 port 之间的第一行有 2 个空格,第二行有 4 个空格。由于 %s 会一直读取到空格,那么 sscanf 有没有办法忽略所有空格?

c scanf
1个回答
0
投票

该功能的一个非常简单的实现:

char **split(char **argv, int *argc, const char *str, const char *delimiter, int allowempty)
{
    char *string = malloc(strlen(str + 1));
    strcpy(string, str);
    *argc = 0;
    do
    {
        if(*string && (!strchr(delimiter, *string) || allowempty))
        {
            argv[(*argc)++] = string;
        }
        while(*string && !strchr(delimiter, *string)) string++;
        if(*string) *string++ = 0;
        if(!allowempty) 
            while(*string && strchr(delimiter, *string)) string++;
    }while(*string);

    for(int arg = 3; arg < *argc - 5 - 1; arg++)
    {
        argv[3][strlen(argv[arg])] = ' ';
        memmove(&argv[4], &argv[arg + 2], sizeof(*argv) * (*argc - 4));
        *argc -= 1;
    }
    return argv;
}



int main(void)
{
    char *argv[20];
    char str[1024];
    int argc;

    while(fgets(str, sizeof(str), stdin))
    {
        split(argv, &argc, str, " ", 0);
        for(int arg = 0; arg < argc; arg++)
        {
            printf("arg[%d] = `%s`\n", arg, argv[arg]);
        }
        free(*argv);
        printf("\n");
    }
}

对于您的输入,它给出:

arg[0] = `72.210.221.197`
arg[1] = `4145`
arg[2] = `Socks5`
arg[3] = `United States`
arg[4] = `Elite`
arg[5] = `932ms`
arg[6] = `93.8%`
arg[7] = `10`
arg[8] = `minutes
`

arg[0] = `176.98.90.20`
arg[1] = `8080`
arg[2] = `HTTP`
arg[3] = `Ukraine`
arg[4] = `Elite`
arg[5] = `183ms`
arg[6] = `77.3%`
arg[7] = `4`
arg[8] = `minutes`

PS,它可以写得更好,但宿醉阻止我的大脑形成太复杂的数学

© www.soinside.com 2019 - 2024. All rights reserved.