strtok似乎删除了字符串部分 - 我使用它了吗?

时间:2016-11-19 17:30:23

标签: c string pointers strtok

我想使用strtok()将一行划分为标记,但该函数似乎只是制作第一个标记并“摧毁”其余标记。我使用printf()检查发生了什么,发现它刚好在token= strtok(line,delimit)之后。 这是我的主要,read_line和parse_args函数:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define PROMPT "$"
#define MAX_LINE 512
void main(){
    char line[MAX_LINE]; 
    while(read_line(line)){
        execute_line(line);
    }
}

char *read_line(char *line){ 
    printf("%s ",PROMPT);
    fflush(stdout);
    line=fgets(line,MAX_LINE,stdin);
    return line;
}

int parse_args(char **args, char *line){
    printf("%s", line); //If it reads "Hello how are you?", here it prints properly
    int n=0;
    char* token;
    char delimit[]=" \t\r\n\v\f";
    token=strtok(line,delimit);
    printf("%s", line); //however here it just prints "Hello" 
    while(token!=NULL){
        printf("token%i: %s\n",n,token);
        *args=token;
        n++;
        *args++;
        token=strtok(NULL,delimit);
    }
    printf("token%i: %s\n",n,token);
    *args=token;
    return n;
}

int execute_line(char *line){
    char **args;
    parse_args(args,line);
    check_internal(args);
    return 0;
}

3 个答案:

答案 0 :(得分:0)

strtok用NUL字符替换分隔符,以便它可以返回仍然在原始缓冲区中的标记的指针。

*args++具有误导性。它会增加args,但*是不必要的。

答案 1 :(得分:0)

the standard declaration

#include <string.h>

char *strtok(char *restrict s, const char *restrict sep);

注意以及 char *restrict s不包含conststrtok()修改它分割为标记的字符串。

答案 2 :(得分:0)

token=strtok(line,delimit);
printf("%s", line); //however here it just prints "Hello"

这正是strtok所做的:)

它实际上是你的线,并放置'\ 0'而不是下一个分隔符。 您应该尝试使用调试器查看代码,之后使用strtok会更有意义。

祝你好运!