我正在编写自己的 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,','),它会返回一个错误的异常错误。
您的功能存在几个问题。第一个是第一个参数的类型应为
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'
附加到输入的字符串中。