C只打印数组的第一个字符,不打印其余的字符?

时间:2014-09-07 05:30:03

标签: c arrays string pointers memory

基本上我必须标记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

2 个答案:

答案 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会记住指向分隔符的下一个字符的地址。所以应该调用后续调用空指针。