【问题标题】:Input returns the correct string but doesn't run the function输入返回正确的字符串但不运行函数
【发布时间】:2015-05-02 13:28:12
【问题描述】:

我有以下代码:

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 时,它会返回

输入:乘法

代币:倍增

但是这不会打印出WORKING。谁能解释为什么这不能按预期工作?

【问题讨论】:

  • strtok 调用后尝试打印tok
  • @tivn tok 与 input 相同,应该调用 printf 函数但不起作用
  • tok 是否等于 "MULTIPLY\n"
  • @D.Shawley 不是!我是从酷哥的评论中发现的!
  • 从get_command()返回之前,需要调用'free(cm)'否则代码会出现内存泄漏

标签: c string malloc getline strlen


【解决方案1】:

在你的代码中,你需要改变

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

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

为终止空字符留出空间。

strlen() 不计算终止的 null,如果您在复制期间不分配内存来保存 null,您将面临导致 undefined behavior. 的内存溢出

根据strcpy()man page

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

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

也就是说,根据getline()man page

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

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

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

另外,请do no castmalloc()的返回值。

【讨论】:

  • 嗯,我以为是空终止符的问题,所以我尝试了这个,但似乎仍然没有打印任何东西。
  • @KadanaKanz ,尝试在get_command的开头添加cmd[strcspn(cmd,"\n")]=0
  • @KadanaKanz getline() 读取 newline 并将其存储到输入缓冲区。你可以试试strncmp(),它会起作用的。或者你必须去掉尾随的\n
  • @CoolGuy 成功了!谢谢! (也得到了一些很好的阅读!:))
  • @Sourav 感谢您提供的信息,下次我一定会这样做。
猜你喜欢
  • 2021-08-10
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 2014-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-10
相关资源
最近更新 更多