基本上我必须标记4列线并将这些标记放入数组中,所以我在下面创建了这个函数。
char** tokeniser(char* lineToToken)
{
int i = 0;
char** tokenList = malloc(4*sizeof(char*));
char* token;
while ((token = strtok(lineToToken, " ")) != NULL && i<4)
{
tokenList[i] = malloc(strlen(token) + 1);
strcpy(tokenList[i], token);
++i;
}
return tokenList;
}
并且主要是我有这个简单的东西来测试它,并且只获得第一个元素打印4次..
for(int i = 0; i<3; i++)
{
printf("%s", tokenList[i]);
}
我通过的文本文件是 &#34; asda asdasd 23 asd&#34;,但我只得到asda 4次:S
答案 0 :(得分:3)
问题在于您使用strtok()
。来自cplusplus.com的文档说得最好:
在第一次调用时,函数需要一个C字符串作为str的参数,其第一个字符用作扫描标记的起始位置。在后续调用中,函数需要一个空指针,并在最后一个令牌结束后立即使用该位置作为扫描的新起始位置
总之,您要反复传递要被标记化的字符串,而不是仅在第一次传递它(并且NULL
后续时间)
因此,以下程序可能会为您提供所需的示例:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
char** tokeniser(char* lineToToken)
{
int i = 0;
char** tokenList = (char**) malloc(4 * sizeof(char*));
char* token = strtok(lineToToken, " ");
while(token != NULL && i < 4)
{
tokenList[i] = (char*) malloc(strlen(token) + 1);
strcpy(tokenList[i], token);
token = strtok(NULL, " ");
++i;
}
return tokenList;
}
int main(int argc, char const* argv[])
{
char str[] = "asda asdasd 23 asd";
char** tokenList = tokeniser(str);
for(int i = 0; i < 4; ++i)
{
printf("%s\n", tokenList[i]);
}
return 0;
}
在我的机器上打印:
asda
asdasd
23
asd
答案 1 :(得分:1)
在上面的函数中,每次Strtok函数都传递相同字符串的起始地址。
一般来说,strtok函数应该按以下方式调用。
#include<stdio.h>
#include<string.h>
void main() {
char Src[25]="Hare Krishna Hare Rama";
char C[2]=" ";
char *del=C;
char *temp[5];
int i=0;
temp[i] = strtok(Src,del);
while(temp[i] !=NULL) {
printf("The str is <%s\n>",temp[i]);
temp[++i] = strtok(NULL,del);
}
}
当您第一次呼叫时,您必须传递字符串和分隔符的起始地址。 然后strtok返回指向分隔符的start指针。所以下次当你调用时不需要传递字符串的起始地址时,strtok会记住指向分隔符的下一个字符的地址。所以应该调用后续调用空指针。