如果我欺骗了主题,我真的很抱歉,我在这里搜索但没有结果。 我有代码
void split(char* str, char* splitstr)
{
char* p;
char splitbuf[32];
int i=0;
p = strtok(str,",");
while(p!= NULL)
{
printf("%s", p);
sprintf(&splitstr[i],"%s",p);
i++;
p = strtok (NULL, ",");
}
}
如何使用正确的 sprintf 将 strtok 分割的单词放入字符串数组? 我可以以某种方式避免 strtok 创建的断线吗? 我正在使用 ANSI C 进行编程。我以相同的方式声明了数组 splitstr 和 str。
char* splitstr;//in main char splitstr[32];
感谢您的帮助。
编辑:
i would like do something like this: INPUT (it is a string) > "aa,bbb,ccc,ddd" I declare: char tab[33]; OUTPUT (save all items to array of strings if it is even possible) > tab[0] is "aa" tab[1] is "bbb" ... tab[3] is "ddd" but not "ddd(newline)"
编辑2 [18:16]
我忘记添加数据字符串来自读取文件行。这就是为什么我写了“ddd(换行符)”。我发现之后 strtok 也显示了新行,但作为另一个项目显示。顺便说一句,所有答案都有助于思考问题。几秒钟前,我的笔记本电脑坏了(我不知道为什么屏幕变黑),一旦我控制了我的电脑,我就会检查代码。 :-)
最佳答案
试一下:
#include <stdlib.h>
#include <string.h>
...
void split(char *str, char **splitstr)
{
char *p;
int i=0;
p = strtok(str,",");
while(p!= NULL)
{
printf("%s", p);
splitsr[i] = malloc(strlen(p) + 1);
if (splitstr[i])
strcpy(splitstr[i], p);
i++;
p = strtok (NULL, ",");
}
}
然后,在main
中:
#define MAX_LEN ... // max allowed length of input string, including 0 terminator
#define MAX_STR ... // max allowed number of substrings in input string
int main(void)
{
char input[MAX_LEN];
char *strs[MAX_STR] = {NULL};
...
split(input, strs);
...
}
一些解释。
strs
在 main
中定义为指向 char
的指针数组。每个数组元素将指向从输入字符串中提取的字符串。在 main 中,分配的只是指针数组,每个元素最初都是 NULL;每个元素的内存将在 split
函数中使用 malloc
根据子字符串的长度进行分配。 某处在完成 strs
后,您需要使用 free
释放这些指针:
for (i = 0; i < MAX_STR; i++)
free(strs[i]);
现在,为什么 splitstr
声明为 char **
而不是 char *[MAX_STR]
?除非它是 sizeof
或 &
运算符的操作数,或者是用于在声明中初始化另一个数组的字符串文字,否则数组表达式将隐式具有其类型从T的N元素数组
转换为指向T的指针
,表达式的值将是数组中第一个元素的位置。
当我们调用split
时:
split(input, strs);
数组表达式input
从类型char [MAX_LENGTH]
隐式转换为char *
(T == char
code>),数组表达式 strs
从类型 char *[MAX_STRS]
隐式转换为 char **
(T == 字符*
)。因此,splitstr
接收两个参数的指针值,而不是数组值。
关于c - strtok - 如何避免换行并放入字符串数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5156119/