从具有可预测格式的字符串中提取两个子字符串

时间:2012-03-12 03:45:09

标签: c

我正在尝试从字符串中提取两个子字符串:

char test[] = "today=Monday;tomorrow=Tuesday";
char test1[20];
char test2[20];

sscanf(test, "today=%s;tomorrow=%s", test1, test2);

当我今天打印出来时,我会在星期一而且还有其余的字符串。我希望test1是星期一,我希望test2是星期二。我如何正确使用sscanf?

2 个答案:

答案 0 :(得分:3)

关键是要告诉sscanf停止的地方 在你的情况下,将在分号 如果你没有指定那么%s说明直到下一个空格,就像@mkasberg提到的那样。

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

int main() {
  char *teststr = "today=Monday;tomorrow=Tuesday";
  char today[20];
  char tomorrow[20];

  sscanf(teststr, "today=%[^;];tomorrow=%s", today, tomorrow);
  printf("%s\n", today);
  printf("%s\n", tomorrow);

  return 0;
}

产地:

Monday
Tuesday

编辑:
您可以使用strtok找到有用的替代方案:

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

int main () {
  const char teststr[] = "today=Monday;tomorrow=Tuesday";
  const char delims[] = ";=";
  char *token, *cp;
  char arr[4][20];
  unsigned int counter = 0;
  unsigned int i;

  cp = strdup(teststr);
  token = strtok(cp, delims);
  strcpy(arr[0], token);

  while (token != NULL) {
    counter++;
    token = strtok(NULL, delims);
    if (token != NULL) {
        strcpy(arr[counter], token);
    }
  }

  for (i = 0; i < counter; i++) {
    printf("arr[%d]: %s\n", i, arr[i]);
  }

  return 0;
}

结果:

arr[0]: today
arr[1]: Monday
arr[2]: tomorrow
arr[3]: Tuesday

答案 1 :(得分:0)

使用%s标记时,根据此文档,sscanf会一直读取,直到找到下一个空格:http://www.cplusplus.com/reference/clibrary/cstdio/sscanf/

因此,例如,您可以将字符串更改为

char test[] = "today=Monday tomorrow=Tuesday";