我有以下代码:
bool get_command(char *cmd){
char *cm = (char*)malloc(strlen(cmd));
strcpy(cm,cmd);
const char *tok = strtok(cm," ");
if(!tok)
return false;
if(!strcmp(tok,"MULTIPLY"))
{
printf("WORKING!n");
return true
}
....
int main(void){
while(1){
char *input = NULL;
char buf[MAX_LINE_LENGTH] = {0};
int read;
size_t len;
read = getline(&input, &len, stdin);
if (-1 != read){
printf("Input: %sn", input);
sprintf(buf, "%s", input);
get_command(input);
} else {
printf("No line readn");
}
free(input);
}
return 0;
}
当我运行代码和输入MULTIPLY
时,它返回
输入:乘法
令牌:乘数
但是,这不会打印出WORKING
。谁能解释为什么这不预期?
在您的代码中,您需要更改
char *cm = (char*)malloc(strlen(cmd));
to
char *cm = malloc(strlen(cmd) + 1);
有用于终止空字符的空间。
strlen()
不计算终止空的null,如果您在复制过程中不分配记忆,则您将面临内存覆盖,从而导致不确定的行为。
根据 strcpy()
的人页面
char *strcpy(char *dest, const char *src);
strcpy()
函数复制了src
指向的字符串,包括终止null字节(' '
),称为dest
指向的缓冲区。字符串可能不会重叠,并且目标字符串dest
必须足够大才能接收副本。
也就是说,根据getline()
的人页面
getline()
从流中读取一整行,将包含文本的缓冲区的地址存储到*lineptr
中。缓冲区的终止为无效,如果找到了一个newline字符。
由于您的定界符字符串不包括n
,因此令牌将包含n
。为了避免,要做以下任何一个
- 在定界线字符串中包括
n
- 使用
strncmp()
进行比较。 - 在获取输入后剥离
n
。
另外,请不要铸造malloc()
的返回值。