C 输入返回正确的字符串,但不返回';我不能运行这个函数

C 输入返回正确的字符串,但不返回';我不能运行这个函数,c,string,malloc,getline,strlen,C,String,Malloc,Getline,Strlen,我有以下代码: 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")

我有以下代码:

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: %s\n", input);
      sprintf(buf, "%s", input);
      get_command(input);
    } else {
       printf("No line read\n");
   }
   free(input);
  }
 return 0;
}
当我运行代码并输入
MULTIPLY
时,它返回

输入:乘法

标记:乘法


但是,这不会打印出正在工作的
。有人能解释为什么这不能按预期工作吗?

在您的代码中,您需要更改

char *cm = (char*)malloc(strlen(cmd));

有终止空字符的空间

strlen()
不计算终止的null,如果在复制过程中没有分配内存来保存null,您将面临内存溢出问题

根据
strcpy()

char*strcpy(char*dest,const char*src)

strcpy()
函数将
src
指向的字符串(包括终止的空字节(
'\0'
)复制到
dest
指向的缓冲区。字符串不能重叠,目标字符串
dest
必须足够大才能接收副本

也就是说,根据
getline()

getline()
从流中读取整行,将包含文本的缓冲区地址存储到
*lineptr
中。缓冲区以null结尾,如果找到换行符,则包含换行符

由于您的分隔符字符串不包含
\n
,因此令牌将包含
\n
。要避免,请执行以下任一操作

  • 在分隔符字符串中包含
    \n
  • 使用
    strncmp()
    进行比较
  • 获取输入后,剥去
    \n

另外,请输入
malloc()

Hmm的返回值,我认为这是空终止符的问题,所以我尝试了这个方法,但似乎仍然没有打印任何内容。@KadanaKanz,尝试在
get\u命令的开头添加
cmd[strcspn(cmd,“\n”)]=0
@KadanaKanz
getline()
读取换行符并将其存储到输入缓冲区。您可以尝试使用
strncmp()
,它会起作用。或者,您必须剥去尾部的
\n
@CoolGuy,这才是有效的!非常感谢。(也得到了一些很好的阅读!:)@Sourav谢谢你提供的信息,我下次一定会这样做。在调用strtok后尝试打印
tok
。@tivn-tok与输入相同,它应该调用printf函数,但不起作用
tok
可能等于
“乘法\n”
。@D.Shawley不是!我从酷哥的评论中发现了!在从get_command()返回之前,需要调用“free(cm)”,否则代码将出现内存泄漏
char *cm = malloc(strlen(cmd) + 1);