Sscanf - 使用不同的分隔符进行解析

时间:2015-05-02 07:21:27

标签: c string io scanf

我想用sscanf解析我的字符串:

char string[] = "/home/my/estf 122,323 452,323 662,343";

字符串的第一个元素,它的路径和下一个是以逗号或白色字符为分隔符的整数。这是我的完整代码:

#include <stdio.h>
#include <stdlib.h>

int main(void) {

  char string[] = "/home/my/estf 122,323 452,323 662,343";

  char path[100];
  int int1, int2, int3, int4, int5, int6;

  sscanf(string, "%s %d[^,] %d %d[^,] %d %d[^,] %d",
          path, &int1, &int2, &int3, &int4, &int5, &int6);
  printf("Path:%s INT1:%d INT2:%d INT3:%d INT4:%d INT5:%d INT6:%d\n",
          path, int1, int2, int3, int4, int5, int6);
  return 0;
}

它错了什么?是否可以扩展它,解析动态的整数(完全没有6)并将其存储在整数数组中?

3 个答案:

答案 0 :(得分:1)

您可以这样做:

char a[3][16], z;
int b[8] = {0};
char x[] = "/home/my/estf 122,323 452,323 662,343", y[64];
sscanf(x, "%c %[^/ ,] %c %[^/] %c %[^/ ] %d %c %d %d %c %d %d %c %d", &z, a[0], &z, a[1], &z, a[2], &b[0], &z, &b[1],  &b[2], &z, &b[3],  &b[4], &z, &b[5]);
for (int i = 0; i < 3; i++) {
    printf("%s ", a[i]);
}
for (int i = 0; b[i] != 0; i++) {
    printf("%d ", b[i]);
}

可能有更好的方法可以做到这一点,但使用sscanf你就是这样做的。您甚至可以将非常长的sscanf行转换为循环。

使用sscanf时,必须使用在否定扫描集中指定的字符。因此,对于像这样的扫描集:[^ /]将读取/第一次出现的所有字符。但是,指针仍然位于源字符串中的/。您必须使用/并继续阅读。

有关sscanf如何工作的更多信息,请查看man sscanf

答案 1 :(得分:1)

  

是否可以扩展它,以解析动态的整数(不是6)   完全)并将其存储在整数数组中?

您可以在循环中使用strtol

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    char str[] = "/home/my/estf 122,323 452,323 662,343";
    char path[100];
    int ai[32];
    char *ptr;
    int n = 0;

    ptr = strchr(str, ' ');
    sprintf(path, "%.*s", ptr - str, str);
    while (*ptr) {
        ai[n++] = (int)strtol(ptr, &ptr, 10);
        if (*ptr) ptr++;
    }
    printf("Path:%s", path);
    for (int i = 0; i < n; i++) {
        printf(" INT%d=%d", i + 1, ai[i]);
    }
    printf("\n");
    return 0;
}

答案 2 :(得分:1)

您似乎希望使用strtok()

之类的内容

以下是example略有修改的内容:

/* strtok example */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main ()
{
  char string[] = "/home/my/estf 122,323 452,323 662,343";
  char * pch;

  pch = strtok (string, " ,");
  while (pch != NULL)
  {
    pch = strtok (NULL, " ,");
    if (pch)
    {
        int val = atoi(pch);
        printf ("%d\n", val);
    }
  }

  return 0;
}