strtok 似乎删除了字符串部分——我使用的对吗?
strtok seems to delete string portion - Am I using it right?
我想使用 strtok() 将一行分成标记,但该函数似乎只生成第一个标记,"destroying" 其余部分。我使用 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;
}
strtok
将分隔符替换为 NUL 字符,以便它可以 return 指向仍在原始缓冲区中的标记的指针。
*args++
具有误导性。它确实会增加 args
,但是 *
是不必要的。
#include <string.h>
char *strtok(char *restrict s, const char *restrict sep);
请注意 嗯 char *restrict s
不包含 const
。 strtok()
修改它拆分为标记的字符串。
token=strtok(line,delimit);
printf("%s", line); //however here it just prints "Hello"
这正是 strtok 所做的:)
它实际上占用了你的行,并放置了一个“\0”而不是下一个分隔符。
您应该尝试使用调试器查看您的代码,之后使用 strtok 会更有意义。
祝你好运!
我想使用 strtok() 将一行分成标记,但该函数似乎只生成第一个标记,"destroying" 其余部分。我使用 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;
}
strtok
将分隔符替换为 NUL 字符,以便它可以 return 指向仍在原始缓冲区中的标记的指针。
*args++
具有误导性。它确实会增加 args
,但是 *
是不必要的。
#include <string.h>
char *strtok(char *restrict s, const char *restrict sep);
请注意 嗯 char *restrict s
不包含 const
。 strtok()
修改它拆分为标记的字符串。
token=strtok(line,delimit);
printf("%s", line); //however here it just prints "Hello"
这正是 strtok 所做的:)
它实际上占用了你的行,并放置了一个“\0”而不是下一个分隔符。 您应该尝试使用调试器查看您的代码,之后使用 strtok 会更有意义。
祝你好运!