我有以下代码片段:
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指针。我一直在努力解决这个问题几个小时,我已经阅读了这个功能的文档,我已经搜索了关于这个主题的其他回复,但没有一个是令人满意的。如果您对我的错误有所了解,请帮助我。
答案 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()
buffer2
strtok()
的调用除了整个输入行之外不会找到任何内容。
因为在输入任何空格之前输入将停止
因为space
是“空格”字符之一。建议以下代码:
#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);
}
}
}