我正在尝试使用 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 有没有办法忽略所有空格?
该功能的一个非常简单的实现:
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,它可以写得更好,但宿醉阻止我的大脑形成太复杂的数学