strtok() 没有读过第一个输入片段
strtok() not reading past the first input piece
我正在尝试编写 Linux shell 操作系统 class 的替代品,但在解析输入字符串时遇到问题。我能够读取字符串输入的第一行,但是一旦它到达任何 space 定界符,它就会完全跳过其他所有内容并继续进行新提示。下面是我要处理的代码。
while(1){
//Flush I/O streams to prevent duplicate '#' printing each new line
fflush(stdout);
fflush(stdin);
printf("# ");
//Take in the input and store it in an auxiliary variable.
scanf("%s", input);
strcpy(commandInput, input);
char *ptr = strtok(commandInput, delimiter); //Parse the command and check what it is below.
if(strcmp(commandInput, "byebye") == 0){ //End the shell program
exit(1);
} else if(strcmp(commandInput, "whereami") == 0){ //Get the current working directory
getCurrentDirectory();
break;
} else if(strcmp(commandInput, "movetodir") == 0){
//Store the new directory name once returned
strcpy(currentDirectory, changeDirectory());
break;
} else {
//Handles any invalid input strings of any length
printf("%s\n", ptr);
while(ptr != NULL){
printf("%s\n", ptr);
ptr = strtok(NULL, delimiter);
}
}
}
例如,下面是当我输入一个在标记之间有 space 的随机字符串时得到的输出:
# hi there
hi
hi
# byebye
它也应该打印出 'there',但它从未到达。任何帮助将不胜感激!
正如我[在我的最高评论中]提到的那样,不在输入流上做fflush
。
您正在做:
scanf("%s",input);
这只会在给定行上获得 第一个 标记。因此,如果输入行是(例如)hello world
,scanf
只会将 hello
放入 input
替换为:
fgets(input,sizeof(input),stdin);
为了说明 fgets
留在缓冲区中的 newline,请确保 delimiter
类似于:
const char *delimiter = " \t\n";
我正在尝试编写 Linux shell 操作系统 class 的替代品,但在解析输入字符串时遇到问题。我能够读取字符串输入的第一行,但是一旦它到达任何 space 定界符,它就会完全跳过其他所有内容并继续进行新提示。下面是我要处理的代码。
while(1){
//Flush I/O streams to prevent duplicate '#' printing each new line
fflush(stdout);
fflush(stdin);
printf("# ");
//Take in the input and store it in an auxiliary variable.
scanf("%s", input);
strcpy(commandInput, input);
char *ptr = strtok(commandInput, delimiter); //Parse the command and check what it is below.
if(strcmp(commandInput, "byebye") == 0){ //End the shell program
exit(1);
} else if(strcmp(commandInput, "whereami") == 0){ //Get the current working directory
getCurrentDirectory();
break;
} else if(strcmp(commandInput, "movetodir") == 0){
//Store the new directory name once returned
strcpy(currentDirectory, changeDirectory());
break;
} else {
//Handles any invalid input strings of any length
printf("%s\n", ptr);
while(ptr != NULL){
printf("%s\n", ptr);
ptr = strtok(NULL, delimiter);
}
}
}
例如,下面是当我输入一个在标记之间有 space 的随机字符串时得到的输出:
# hi there
hi
hi
# byebye
它也应该打印出 'there',但它从未到达。任何帮助将不胜感激!
正如我[在我的最高评论中]提到的那样,不在输入流上做fflush
。
您正在做:
scanf("%s",input);
这只会在给定行上获得 第一个 标记。因此,如果输入行是(例如)hello world
,scanf
只会将 hello
放入 input
替换为:
fgets(input,sizeof(input),stdin);
为了说明 fgets
留在缓冲区中的 newline,请确保 delimiter
类似于:
const char *delimiter = " \t\n";