c语言 - 输入返回正确的字符串,但不运行函数



我有以下代码:

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()的返回值。

相关内容

  • 没有找到相关文章

最新更新