【发布时间】:2016-11-19 17:30:23
【问题描述】:
我想使用 strtok() 将一行划分为标记,但该函数似乎只是生成第一个标记并“破坏”其余标记。我使用 printf() 检查发生这种情况的位置,发现就在token= strtok(line,delimit) 之后。
这是我的 main、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;
}
【问题讨论】:
-
void main错误;main应该返回int。 -
你错过了几个
#includes。 -
MAX_LINE未定义。 -
见:en.cppreference.com/w/c/string/byte/strtok。特别是#1 的第 6 个项目符号。
-
你永远不会打电话给
parse_args。