我想分割这个字符串
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;
}
答案 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;
}