如何在 C 中解析标准输入?
How to parse stdin in C?
我使用 select()
来知道何时必须从标准输入读取。我称这个函数为:
void
CLI()
{
char *line=(char*)malloc(sizeof(char)*32);
char *cmd=(char*)malloc(sizeof(char)*16);
char *arg1=(char*)malloc(sizeof(char)*8);
char *arg2=(char*)malloc(sizeof(char)*8);
while(fgets(line, sizeof(line), stdin) != NULL)
{
cmd=strtok(line," \n\r\t");
arg1=strtok(NULL," \n\r\t");
arg2=strtok(NULL," \n\r\t");
if(cmd==NULL) break;
printf("cmd=%s, arg1=%s, arg2=%s",cmd,arg1,arg2);
}
free(line);
free(cmd);
free(arg1);
free(arg2);
}
输入示例:#set PAR 0
我得到的:
*** Error in './myprogram': double free or corruption (fasttop): 0x0000000001cc70f0 ***
我做错了什么?
这里的问题是
fgets(line, sizeof(line), stdin
,不,那不是你想要的。 sizeof()
returns数据类型的大小,不是指针指向的区域。您必须通过该指针提供可供使用的内存量,例如
while(fgets(line, 32 , stdin) != NULL) //sizeof(char) == 1, can be ommitted
通过对指针进行malloc()
分配后,使用赋值=
会导致内存泄漏。使用 strcpy()
来 复制 由 strtok()
返回的 token 到所需的指针。
移除
char *cmd=(char*)malloc(sizeof(char)*16);
char *arg1=(char*)malloc(sizeof(char)*8);
char *arg2=(char*)malloc(sizeof(char)*8);
为什么?因为你 malloc
ed 的记忆在这里丢失了:
cmd=strtok(line," \n\r\t");
arg1=strtok(NULL," \n\r\t");
arg2=strtok(NULL," \n\r\t");
strtok
returns一个char*
。您更改指针指向的位置。这会导致 内存泄漏 ,因为您还没有 free
分配的内存。你不需要
free(cmd);
free(arg1);
free(arg2);
一旦您删除了上述对 malloc
的三个调用。
此外,Don't cast the result of malloc
and family。请注意 sizeof(char)
是 1,因为不需要将它与 malloc
中的另一个数字相乘。
我使用 select()
来知道何时必须从标准输入读取。我称这个函数为:
void
CLI()
{
char *line=(char*)malloc(sizeof(char)*32);
char *cmd=(char*)malloc(sizeof(char)*16);
char *arg1=(char*)malloc(sizeof(char)*8);
char *arg2=(char*)malloc(sizeof(char)*8);
while(fgets(line, sizeof(line), stdin) != NULL)
{
cmd=strtok(line," \n\r\t");
arg1=strtok(NULL," \n\r\t");
arg2=strtok(NULL," \n\r\t");
if(cmd==NULL) break;
printf("cmd=%s, arg1=%s, arg2=%s",cmd,arg1,arg2);
}
free(line);
free(cmd);
free(arg1);
free(arg2);
}
输入示例:#set PAR 0
我得到的:
*** Error in './myprogram': double free or corruption (fasttop): 0x0000000001cc70f0 ***
我做错了什么?
这里的问题是
fgets(line, sizeof(line), stdin
,不,那不是你想要的。sizeof()
returns数据类型的大小,不是指针指向的区域。您必须通过该指针提供可供使用的内存量,例如while(fgets(line, 32 , stdin) != NULL) //sizeof(char) == 1, can be ommitted
通过对指针进行
malloc()
分配后,使用赋值=
会导致内存泄漏。使用strcpy()
来 复制 由strtok()
返回的 token 到所需的指针。
移除
char *cmd=(char*)malloc(sizeof(char)*16);
char *arg1=(char*)malloc(sizeof(char)*8);
char *arg2=(char*)malloc(sizeof(char)*8);
为什么?因为你 malloc
ed 的记忆在这里丢失了:
cmd=strtok(line," \n\r\t");
arg1=strtok(NULL," \n\r\t");
arg2=strtok(NULL," \n\r\t");
strtok
returns一个char*
。您更改指针指向的位置。这会导致 内存泄漏 ,因为您还没有 free
分配的内存。你不需要
free(cmd);
free(arg1);
free(arg2);
一旦您删除了上述对 malloc
的三个调用。
此外,Don't cast the result of malloc
and family。请注意 sizeof(char)
是 1,因为不需要将它与 malloc
中的另一个数字相乘。