返回strtok函数中剩余的字符串?

问题描述 投票:0回答:1

我正在编写自己的 strtok 函数。我该如何制作才能将剩余的字符串作为输出参数返回?

这是我到目前为止所做的。

char *mystringtokenize(char **string, char delimiter){
    static char *str = NULL;
    int stringIndex=0;
    if(string != NULL){//check if string is NULL, if its not null set str to string
        str = string;
    }
    if(string == NULL){//return NULL if string is empty
        return NULL;
    }
    do{//traverse through string
        if(!str[stringIndex]){//if str at string index is null character, stop while loop
            break;
        }
        stringIndex++;//index through string
    }while(str[stringIndex] != delimiter);
    
    str[stringIndex] = '\0';//cut the string
    char *lastToken = str;//set last token to the cut off part
    
    return lastToken;
}

当我在 main 中调用它并尝试传入需要标记化的文件时,我收到了一个严重的异常错误。

int main(int argc, char const *argv[])
{
    FILE *inputStream =fopen("FitBitData.csv","r");
    int index=0;
    int fitbitindex=0;
    char testline[100];
    char minute[10]="0:00:00";
    FitbitData fitBitUser[1446];
    if(inputStream != NULL){
        while(fgets(testline,sizeof(testline),inputStream) != NULL){
            strcpy(fitBitUser[fitbitindex].patient,mystringtokenize(testline,','));
            strcpy(fitBitUser[fitbitindex].minute,mystringtokenize(NULL,','));
            printf("%s %s\n",fitBitUser[fitbitindex].patient,fitBitUser[fitbitindex].minute);
            printf("%s\n",fitBitUser[fitbitindex].patient);
            fitbitindex++;
        }

    }

    return 0;
}

例如,当我有一行“Hello, World”并将其标记化时。它会返回Hello。但是如果我再次调用它 mystringtokenize(NULL,','),它会返回一个错误的异常错误。

c strtok
1个回答
0
投票

您的功能存在几个问题。第一个是第一个参数的类型应为

char *
而不是
char **

char *mystringtokenize(char *string, char delimiter);

如果第一个参数是空指针,则该函数始终返回

NULL
:

if(string == NULL){//return NULL if string is empty
    return NULL;
}

例如这样的函数调用

mystringtokenize(NULL,',')

不提取字符串。

具有静态存储持续时间的指针

str
不会在函数调用之间保留提取的字符串的最后位置。

传递的字符串可以从分隔符开始。在这种情况下,您的函数返回一个空字符串。

注意函数

fgets
可以将换行符
'\n'
附加到输入的字符串中。

© www.soinside.com 2019 - 2024. All rights reserved.