我想使用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;
}
答案 0 :(得分:0)
strtok
用NUL字符替换分隔符,以便它可以返回仍然在原始缓冲区中的标记的指针。
*args++
具有误导性。它会增加args
,但*
是不必要的。
答案 1 :(得分:0)
#include <string.h>
char *strtok(char *restrict s, const char *restrict sep);
注意以及 char *restrict s
不包含const
。 strtok()
修改它分割为标记的字符串。
答案 2 :(得分:0)
token=strtok(line,delimit);
printf("%s", line); //however here it just prints "Hello"
这正是strtok所做的:)
它实际上是你的线,并放置'\ 0'而不是下一个分隔符。 您应该尝试使用调试器查看代码,之后使用strtok会更有意义。
祝你好运!