这是我用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
答案 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)
感谢您的建议。
混淆packetBuffer
和fullString
是愚蠢的,但是直到现在它始终具有相同的内容才导致问题。
return("%s", ptr)
不是完成的行,没有任何意义,但这里没有问题。
我还没有设法使用纯C,所以我将使用C ++及其String
- 类。不想,但好吧......
无论如何,问题似乎是ptr = strtok(NULL, " ");
行。
ptr = strtok(fullString, " ");
按照预期给出第一个单词,但用NULL
重复它永远不会有用。
lg,couka