【问题标题】:strtok into character arrays not working as expectedstrtok 进入字符数组未按预期工作
【发布时间】:2013-08-06 10:47:54
【问题描述】:

我对 C 编程很陌生,目前正在努力使用 strtok。我想使用以下代码将一个字符串拆分为两个字符串(字符串例如“Bat1:185”,分隔符是冒号):

char batName[13];
char batVoltage[3];
char *result = NULL;

result = strtok(pStringToSplit, pDelimiter);
strcpy(batName, result);

result = strtok(NULL, pDelimiter);
strcpy(batVoltage, result);

在第一次 strtok 调用 batName 包含值(“Bat1”)后,如预期的那样,但在第二个 strtok batName 为空后,batVoltage 包含正确的值“185”。

我知道这段代码很弱,但目前我只是想了解 strtok 的基础知识。我已经花了很多时间寻找解决方案,但找不到任何解决方案。

非常感谢任何提示 彼得

【问题讨论】:

    标签: c strtok


    【解决方案1】:

    185 的值以 nul (\0) 字符结尾,实际占用 4 个字符的空格。您的nul 被写入缓冲区之外,似乎用字符串终止符覆盖了batName 中的第一个字符。

    严格来说,覆盖缓冲区是未定义的行为,因此此代码实际上可以以任何方式运行,具体取决于编译器。

    【讨论】:

    • 太好了,就是这样,非常感谢你们两位的快速帮助!程序正在运行。
    【解决方案2】:

    您的代码中有缓冲区溢出。请记住,目标字符串数组需要一个额外的字符作为终止 '\0' 字符。这意味着当您获得第二个子字符串时,您会覆盖 batVoltage 数组,并且显然会覆盖到 batName 数组中。

    batVoltage 数组的大小增加一,它应该可以正常工作。

    【讨论】:

      【解决方案3】:

      正如 Joachim 指出的那样,您有一个电压缓冲区溢出,因为它的三个字符 185,目标需要一个额外的空间用于 NULL (\0)。

      所以,

      int main ()
      {
      char batName[13]; // Battery Identifier must be <=12, 1 for NULL
      char batVoltage[3+1]; //Increase size, not just 4, but max digits of volatage+1
      char *result = NULL;
      
      char pStringToSplit[] ="Bat1:185";
      const char *pDelimiter=":";
      
      result = strtok(pStringToSplit, pDelimiter);
      strcpy(batName, result);
      
      result = strtok(NULL, pDelimiter);
      strcpy(batVoltage, result);
      
      printf("Battery :%s  Voltage:%s ",batName,batVoltage);
      
        return 0;
      }
      

      【讨论】:

        【解决方案4】:

        正如Joachim PileborgJoachim Isaksson 回答的那样,您将在此处点击Buffer Overflow。如果你解决了这个问题并根据你的字符串继续前进(如果它像这样Bat1:185:Bat2:186:Bat3:187)你可以做一些数学的东西来标记这个字符串。

        After the first strtok call batName contains the value ("Bat1") as expected, but after the second strtok batName is empty, batVoltage contains the correct value "185".

        在这里,您可以轻松查看在每个奇数呼叫后您将收到Bat*,在每个偶数呼叫后您将收到18*

        我希望这对你也有帮助。

        【讨论】:

        • 感谢大家的帮助,非常感谢。将 batVoltage 的大小增加 1 即可解决问题。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-12
        • 1970-01-01
        • 1970-01-01
        • 2016-08-21
        • 2020-10-21
        相关资源
        最近更新 更多