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

标签 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)并将其存储在整数数组中?

最佳答案

你可以这样做:

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

关于c - Sscanf - 使用不同的分隔符进行解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29999589/

相关文章:

c - 有什么方法可以解决段错误吗?

Python 计数子串

c - 如何将输入发送到 C 中的进程?

ruby - 在 ruby​​ 中运行控制台命令,获取子进程的 PID 并在几秒钟内将其终止

C 中的条件 #define

python - PyUnicode字符串和C字符串之间的字符串转换是如何工作的?

无法将 ‘char (*)[1024]’ 转换为 ‘char*’ 作为返回

java - 根据字符串的长度分割字符串

python - 将字符串添加到 URL 末尾

java - 大比较任务的估计