【问题标题】:Why does my C code crash while splitting a line [closed]为什么我的 C 代码在拆分行时崩溃 [关闭]
【发布时间】:2016-12-13 21:45:02
【问题描述】:

我正在尝试拆分字符串int cube = 29; 当一切都被拆分时,我在令牌中得到一个空值,当我尝试将令牌作为字符串分配给 buf 时程序崩溃。这是怎么回事?我想得到 29 并打印出来

#include <stdio.h>
#include <stdlib.h>


int main(void)
    {
        char buf[500];
        sprinf(buf, "int cube = %i", 29);
        const char del[] = " = ";
        char *token;
        token = strtok(buf, del);
        char temporary[500];
        sprintf(temporary, "%s", token);
        int number = atoi(temporary);
        puts(number);

        return 0;
    }

Picture of me debugging the code

【问题讨论】:

  • 我们无法调试不完整的代码。请提供minimal reproducible example。但请仔细阅读 strtok 手册。它不会搜索整个分隔符字符串。它匹配分隔符字符串中的 任何 个字节。
  • 你为buf分配内存了吗?
  • 您无需在分隔符列表中为strtok() 重复空格。它不是在寻找字符串,而是在寻找列表中的任何字符。
  • 您试图将"int cube = 29;" 拆分为什么?您的代码在第一个空格处将其拆分。所以第二个令牌不会是"29"
  • "当一切都被拆分时,我在令牌中得到一个空值。"是的,strtok 就是这样工作的。

标签: c string split crash


【解决方案1】:

第一次调用strtok(buf,del) 将在del 中任何字符的第一次出现处替换一个nul 字符后返回指向buf 的第零个字符的指针。所以如果 buf 是 "int cube = %i" 并且 del 是 " = ',它将用 nul 替换 "int" 和 "cube" 之间的空间,并返回一个指向 buf[0] 的指针,所以结果是 "int" ”。

【讨论】:

  • 如果我将 del 更改为 "=" 仍然会崩溃
  • 当然会崩溃。你在调用 atoi("int cube"),字符串 "int cube" 不能解释为整数。
  • @FredK 不会导致崩溃。如果转换失败,atoi 将返回 0:en.cppreference.com/w/c/string/byte/atoi
  • 那么我怎样才能使 buf 为“29”以便我可以转换它?
  • @FredK 感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多