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 worldscanf 只会将 hello 放入 input

替换为:

fgets(input,sizeof(input),stdin);

为了说明 fgets 留在缓冲区中的 newline,请确保 delimiter 类似于:

const char *delimiter = " \t\n";