这是一个代码,所有方面都应该进行调整。
- 获取字符指针
- 使用 strdup 在 strtok_r 中使用 char 指针
- 使用 strtok_r 是线程安全的
- 完成后免费结果 strdup 因为它在内部使用了 malloc
如果我忘记了什么,请给我提示
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define WHITE " \t\n" // white space, tab and newline for tokenizing arguments
#define MAXARGC 50 // max number of arguments in buf
void handlecommand(int argc, char *argv[])
{
// do some handle code, in this example, just print the arguments
for(int i = 0; i < argc; i++)
printf("argv[%d]='%s'\n", i, argv[i]);
}
void parsecommand(char * cmdstr)
{
char *cmdstrdup = strdup(cmdstr);
if(cmdstrdup == NULL)
//insuficient memory, do some errorhandling.
return;
char *saveptr;
char *ptr;
char *argv[MAXARGC];
int argc;
if((ptr = strtok_r(cmdstrdup, WHITE, &saveptr)) == NULL)
{
printf("%s\n", "no args given");
return;
}
argv[argc = 0] = cmdstrdup;
while(ptr != NULL) {
ptr = strtok_r(NULL, WHITE, &saveptr);
if(++argc >= MAXARGC-1) // -1 for room for NULL at the end
break;
argv[argc] = ptr;
}
// handle command before free
handlecommand(argc, argv);
// free cmdstrdup, cuz strdup does malloc inside
free(cmdstrdup);
}
int main(int argc, char const *argv[])
{
parsecommand("command arg1 arg2 arg3\targ4\narg5 arg6 arg7");
return 0;
}
结果
argv[0]='command'
argv[1]='arg1'
argv[2]='arg2'
argv[3]='arg3'
argv[4]='arg4'
argv[5]='arg5'
argv[6]='arg6'
argv[7]='arg7'