strtok只给了我第一片

时间:2014-08-30 15:14:40

标签: c string strtok

这是我用C编写的第一个项目,我尝试将C字符串拆分为"单词"。

以下几行用于测试和正常工作:

Serial.println("SliceTest2");
  char *ptr;
  char delimiter[] = " ,";
  ptr = strtok(packetBuffer, delimiter);
  Serial.println(ptr);
  ptr = strtok(NULL, delimiter);
  Serial.println(ptr);
  ptr = strtok(NULL, delimiter);
  Serial.println(ptr);
  ptr = strtok(NULL, delimiter);
  Serial.println(ptr);
  ptr = strtok(NULL, delimiter);
  Serial.println(ptr);
  ptr = strtok(NULL, delimiter);
  Serial.println(ptr);

使用包含" a b c d e f g h"这是输出(这是正确的):

SliceTest2
a
b
c
d
e
f

现在,当我使用以下几行时:

char *sliceStr(char fullString[]){
  char *ptr;
  ptr = strtok(packetBuffer, " ");
  ptr = strtok(NULL, "\n\t ");
  return("%s", ptr);
}

并打电话给他们(agin与packetBuffer中的内容相同" a b c d e f g h"):

Serial.println(sliceStr(packetBuffer));

它应该打印

b

但什么也没做。

这是一个arduino项目btw,但是特定于C的问题。

lg,couka

2 个答案:

答案 0 :(得分:0)

这不是纯粹的C. Serial.println(" foo");它是一种类的方法。可能你正在使用C / C ++派生语言对Arduino或类似程序进行编程。

printf("%s", ptr);会将%s替换为地址ptr的字符串 - 但仅限于它是一个函数

return是一个返回值的关键字,在这种情况下,你需要指针ptr

return("%s", ptr);在C中没有意义。

还要注意:返回的char*指针必须指向有效的c字符串,例如在调用函数之前声明的字符串。注意不要返回指向函数内部声明的变量的指针,因为它们是本地的,并在函数结束时消失。

长话短说,请尝试:return ptr;

如果它不起作用并需要进一步的帮助,请指明您使用的语言和平台

修改 return("%s", ptr);错了,但仍然有用。

但是,当您想要标记化的参数实际上是packetBuffer

时,您使用了全局变量fullString

此示例代码将按预期工作并打印b。 我在示例中使用了参数的已分配副本,因为strtok需要可写内存来在标记化期间放置临时零(字符串结尾)。

#include <stdio.h>
#include <string.h>

char *sliceStr(char *packetBuffer){
  char *ptr;
  ptr = strtok(packetBuffer, " ");
  ptr = strtok(NULL, "\n\t ");
  return("%s", ptr);
}

int main() {
    char *str = strdup("a b c d etc");
    printf("%s\n", sliceStr(str));
}

答案 1 :(得分:0)

感谢您的建议。

混淆packetBufferfullString是愚蠢的,但是直到现在它始终具有相同的内容才导致问题。

return("%s", ptr)不是完成的行,没有任何意义,但这里没有问题。

我还没有设法使用纯C,所以我将使用C ++及其String - 类。不想,但好吧......

无论如何,问题似乎是ptr = strtok(NULL, " ");行。

 ptr = strtok(fullString, " ");

按照预期给出第一个单词,但用NULL重复它永远不会有用。

lg,couka