strtok()然后strcmp()在true时返回false

时间:2016-08-27 22:03:20

标签: c strtok

我猜这是一个类型问题,所以也许你可以告诉我它是如何正确完成的。

我正在阅读stdin的命令输入,我想在用户输入q时退出。

我正在使用stdinfgets()的用户输入读入指向字符数组的指针。然后我使用strtok()拼接掉第一个单词并将其指定给另一个指向字符数组的指针。然后我将它与q进行比较,以查看用户是否想要使用strcmp()函数退出程序。

以下是一些代码:

    char *input = (char*)malloc(32 * sizeof(char));
    char *command = (char*)malloc(8 * sizeof(char));

    while (strcmp(command, "q") != 0)
    {
        memset(input, 0, sizeof(input));
        printf("Enter command: ");
        fgets(input, 64, stdin);
        command = strtok(input, " ");
        //if I enter q --> printf("%d", strcmp(command, "q")) == 10
        //if I enter w --> printf("%d", strcmp(command, "q")) == 6
    }

我想要的是,如果command == q然后printf("%d", strcmp(command, "q"))应该等于0,则应该打印任何其他整数。

我还应该注意,我已经验证command已正确分配。换句话说,当我输入qcommand == "q"

2 个答案:

答案 0 :(得分:0)

也许你可以试试这段代码:

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

int main()
{
    char *input = (char*)malloc(32 * sizeof(char));
    char *command = (char*)malloc(8 * sizeof(char));

    while (strcmp(command, "q") != 0)
    {
        memset(input, 0, sizeof(input));
        printf("Enter command: ");
        fgets(input, 64, stdin);
        command = strtok(input, " \n"); // Line corrected.
        //if I enter q --> printf("%d", strcmp(command, "q")) == 10
        //if I enter w --> printf("%d", strcmp(command, "q")) == 6
    }

return 0;

}

答案 1 :(得分:0)

这里有几个问题。

  1. 此处分配的内存

    char *command = (char*)malloc(8 * sizeof(char));
    

    泄漏了这一行

    command = strtok(input, " ");
    

    获取执行作为唯一引用分配的内存被覆盖并因此丢失。

  2. 此处可能发生缓冲区溢出

    fgets(input, 64, stdin);
    

    允许读取更多字节(64)ito input,因为它指的是这里完成的分配

    char *input = (char*)malloc(32 * sizeof(char));
    
  3. 假设用户输入的数据不包含类似&#39; [空白] q ... then命令get assigned此命令的空白

    command = strtok(input, " ");
    

    这导致将NULL传递给strcmp(),以便在此处测试下一次迭代

    while (strcmp(command, "q") != 0)
    

    这样做会调用未定义的行为。

  4. 代码错过了检查相关函数调用的结果,例如malloc()`` and fgets()`。

  5. 投放malloc()&amp;的结果C中不需要朋友,也不建议使用。所以就是不要这样做。它可能很好地隐藏错误。

  6. sizeof (char)定义为1。无需使用它。

  7. 请勿使用&#34; Magic Numbers&#34; /&#34; Tokens&#34;例如32864"q" ......

  8. 如果您想要至少执行一次某个动作,那么在概念上使用while循环是错误的方法。在这种情况下,请使用do-while循环。

  9. 修复所有这些可能会导致以下代码:

    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    
    
    #define INPUT_BUFFER_SIZE (64)
    #define QUIT_STRING "q"
    
    
    int main(void)
    {
      int result = EXIT_SUCCESS; /* Be optimistic. */
    
      char *input = malloc(INPUT_BUFFER_SIZE * sizeof *input);
      if (NULL == input)
      {
        perror("malloc () failed");
        result = EXIT_FAILURE;
      }
      else
      {
        char *command;
    
        do 
        {
          printf("Enter command:\n");
          if (NULL == fgets(input, INPUT_BUFFER_SIZE, stdin))
          {
            if (!feof(stdin))
            {
              result = EXIT_FAILURE;
              fprintf(stderr, "fgets() failed.\n");
            } 
    
            break;
          }
    
          command = strtok(input, " \n"); 
        } while ((command == NULL) || strcmp(command, QUIT_STRING) != 0);
    
        if (NULL != command)
        {
          printf("User quit.\n");
        }
    
        free(input);
      }
    
      return result;
    }