C strtok()和strcmp()问题 #包括 #包括 #包括 #包括 int main(int args,char*argv[]) { 常数int CBUFF=1024; 字符输入[CBUFF]; char-wkdir[CBUFF]; char*命令; printf(“欢迎来到MyShell…\n”); 而(1) { getcwd(wkdir、CBUFF); printf(“%s?”,wkdir); fgets(输入、CBUFF、标准输入); 命令=strtok(输入“”); 如果(strcmp(命令,“cd”)==0) { 字符*路径; path=strtok(空,“”); 如果(chdir(路径)!=0) { printf(“错误:无法将目录更改为指定路径”); } } 如果(strcmp(命令,“退出”)==0)中断; } 返回0; }

C strtok()和strcmp()问题 #包括 #包括 #包括 #包括 int main(int args,char*argv[]) { 常数int CBUFF=1024; 字符输入[CBUFF]; char-wkdir[CBUFF]; char*命令; printf(“欢迎来到MyShell…\n”); 而(1) { getcwd(wkdir、CBUFF); printf(“%s?”,wkdir); fgets(输入、CBUFF、标准输入); 命令=strtok(输入“”); 如果(strcmp(命令,“cd”)==0) { 字符*路径; path=strtok(空,“”); 如果(chdir(路径)!=0) { printf(“错误:无法将目录更改为指定路径”); } } 如果(strcmp(命令,“退出”)==0)中断; } 返回0; },c,C,我在C中创建一个非常简单的命令shell时遇到了一个问题。当我在指令后添加一个空格时,输入也只能以我想要的方式读取。我知道这与我不正确地使用strtok()函数有关,但我无法找出我做错了什么。我已经阅读了的文档,结果是一片空白 我想要的行为: 指令“退出”退出程序。 当前行为: 必须在指令后添加空格,以使其正确解析,即输入“exit”或“cd”。您在缓冲区中留下了尾随的换行符。摆脱它 #include <stdlib.h> #include <stdio.h> #incl

我在
C
中创建一个非常简单的命令shell时遇到了一个问题。当我在指令后添加一个空格时,输入也只能以我想要的方式读取。我知道这与我不正确地使用strtok()函数有关,但我无法找出我做错了什么。我已经阅读了
的文档,结果是一片空白

我想要的行为: 指令“退出”退出程序。 当前行为:
必须在指令后添加空格,以使其正确解析,即输入“exit”或“cd”。

您在缓冲区中留下了尾随的换行符。摆脱它

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>

int main(int args, char* argv[])
{
  const int CBUFF = 1024;
  char input[CBUFF];
  char wkdir[CBUFF];
  char* command;

  printf("Welcome to MyShell...\n");

  while(1)
  {
    getcwd(wkdir, CBUFF);
    printf("%s ? ", wkdir);
    fgets(input, CBUFF, stdin);

    command = strtok(input, " ");

    if(strcmp(command, "cd") == 0)
    {
      char* path;
      path = strtok(NULL, " ");

      if(chdir(path) != 0)
      {
        printf("ERROR: COULD NOT CHANGE DIRECTORY TO SPECIFIED PATH");
      }
    }
    if(strcmp(command, "exit") == 0) break;
  }

  return 0;
}

fgets()
将换行符保留在字符串中。将传递到
strtok()
的分隔符字符串更改为
“\r\n”
。当字符串比较等简单操作无法达到预期效果时,请始终打印出字符串,并在其周围设置防护装置,例如:
printf(“qq%sQQQ\n”,command)
,以帮助您进行调试。如果您没有看到“qqxitqq”,那么您就知道您的字符串不完全包含“exit”。
char *got = fgets(input, CBUFF, stdin);
if (!got) return ; /* EOF -- treat like exit */
size_t gotlen = strlen(got);
if (got[gotlen] == '\n') got[gotlen] = 0;