拆分字符串并将其存储在C中的不同变量中

时间:2016-11-01 07:59:47

标签: c

我想分割这个字符串

  

KIM-TAE渊

并将它们放入不同的变量中,如下所示:

  

data [1] =“kim”data [2] =“tae”data [3] =“yeon”

但我只拆分字符串而不将它们存储到这些变量中。 我怎么能这样做?

这是我的代码:

  char buff[] = "kim-tae-yeon";
  int i = 0;

  char *p = strtok (buff, "-");
  char *data[3];

  while (p)
    {
      data[i++] = p;
      p = strtok (NULL, "-");
    }

  for (i = 0; i < 3; i++)
    {
      printf ("%s\n", &data[i]);
    }

  return 0;
}

4 个答案:

答案 0 :(得分:2)

您的计划效果很好。您传递给printf &data[i]data是一个指针数组(char *[]),这意味着数组的每个条目都是一个指针(char *)。您希望传递给printf字符串data[i]

这是您想要的输出:

for (i = 0; i < 3; i++)
{
    printf("data[%i] = %s\n", i+1, data[i]);
}

正如评论中所述,没有data[3] 数组从data[0]开始,这是C的默认值 你仍然可以有输出

data[1] = kim
data[2] = tae
data[3] = yaeon

将{1}添加到i, 但此输出不代表您实际的data数组。

答案 1 :(得分:1)

这是错误的:

printf("%s\n", &data[i]);

%s格式说明符需要char*,但您提供了char **(指向char的指针)。 data[i] 已经是char *,因此您需要:

printf("%s\n", data[i]);

如果您编译时启用了所有警告(-Wall选项与gcc),您的编译就会告诉您。

答案 2 :(得分:0)

如果您已经准备好限制子串的长度,那么使用普通的strtok()可以更容易地解决这个问题(sscanf()是可怕的,加油!):

const char buff[] = "kim-tae-yeon";
char data[3][32];

if (sscanf(buff, "%31[^-]-%31[^-]-%31[^-]", data[0], data[1], data[2]) == 3)
{
  printf("parts are '%s', '%s' and '%s'\n", data[0], data[1], data[2]);
}

格式说明符,在中间用短划线重复三次,为%31[^-],这意味着“最多收集31个非短划线字符”。 31确保我们的32个字符缓冲区有终止空间。

在格式字符串中重复缓冲区大小有点非DRY,对此最简单的解决方法是使用snprintf()在运行时生成格式字符串,但这会掩盖问题所以我没有'那样做。

答案 3 :(得分:0)

这样的事情可以奏效。而是使用strcpy将指向的字符串(在本例中为buffer)复制到data[i]中的空格。

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

#define STRSIZE 50
#define NUMWORDS 3

int
main(void) {
    char buff[] = "kim-tae-yeon";
    char data[NUMWORDS][STRSIZE];
    char *buffer;
    int i;

    buffer = strtok(buff, "-");

    i = 0;
    while (buffer != NULL) {
        strcpy(data[i], buffer);

        printf("data[%i] = %s\n", i+1, data[i]);

        buffer = strtok(NULL, "-");

        i++;
    }

    return 0;
}