strtok不会返回所有令牌

时间:2016-03-23 17:25:57

标签: c strtok

我有以下代码片段:

char *buffer2 = malloc(1024*sizeof(char));
    scanf("%s",buffer2);
    char *command = strtok(buffer2," ");

    if (strcmp(command,"INFO") == 0)
    {
        char *file_path = strtok(NULL," ");
        if (file_path != NULL)
         {
            info(file_path);
         }
    }

我的目标是:给出像" CMD_NAME ARG1 ARG2" ...根据这种格式标记字符串。到目前为止这么好,我编写了上面的代码,它编译,程序没有崩溃,但结果却是错误的,如果我输入字符串" INFO work / file1.sf&#34 ;该命令被正确解析但是对于file_path,strtok函数返回一个NULL指针。我一直在努力解决这个问题几个小时,我已经阅读了这个功能的文档,我已经搜索了关于这个主题的其他回复,但没有一个是令人满意的。如果您对我的错误有所了解,请帮助我。

1 个答案:

答案 0 :(得分:0)

给出以下代码:

char *buffer2 = malloc(1024*sizeof(char));
scanf("%s",buffer2);
char *command = strtok(buffer2," ");

if (strcmp(command,"INFO") == 0)
{
    char *file_path = strtok(NULL," ");
    if (file_path != NULL)
     {
        info(file_path);
     }
}

表达式'sizeof(char)'由标准定义为1。 将任何东西乘以1不会改变其值 并且对传递给malloc()的参数没有影响。

但是,它会使代码混乱,使理解,调试和维护变得更加困难。

建议删除该表达式。

致电scanf()

  1. 始终检查返回值以确保操作成功。
  2. 使用“%s”格式说明符时.. 必须使用最大输入字符修饰符,因此用户不能超出输入buffer2
  3. 当遇到任何“空白区域”时,“%s”格式说明符将停止输入 对strtok()的调用除了整个输入行之外不会找到任何内容。 因为在输入任何空格之前输入将停止 因为space是“空格”字符之一。
  4. 建议以下代码:

    #define BUFFER_LEN (1024)
    char *buffer2 = NULL;
    if( NULL == (buffer2 = malloc( BUFFER_LEN ) ) )
    { // then malloc failed
        perror( "malloc for 1024 bytes failed")
        exit( EXIT_FAILURE );
    }
    
    // implied else, malloc successful
    
    if( !fgets( buffer2, BUFFER_LEN, stdin ) )
    {// then, fgets failed
        perror( "fgets from stdin failed");
        exit( EXIT_FAILURE )''
    }
    
    // implied else, fgets successful
    
    char *command = NULL;
    
    if( NULL != (command = strtok(buffer2," \n") ) )
    {
        if (strcmp(command,"INFO") == 0)
        {
            char *file_path = NULL;
            if( NULL != (file_path = strtok(NULL," \n") ) )
            {
                info(file_path);
            }
        }
    }