在if语句中使用strtok标记

时间:2017-01-01 22:41:49

标签: c++ arduino

我试图了解如何拆分数组并在if语句中使用标记,但是我没有太多运气。

以下代码适用于Arduino。我正在做的是传递函数receviedChars,它将是:

  

token0,TOKEN1,token2

当我打印出func时,它会读出c,所以我想如果我将func与c进行比较,它应该匹配true。不幸的是,这似乎不会发生。

我对C ++和Arduino很陌生,主要有网络开发背景,所以我可能会误解一些东西

const byte numChars = 32;
char receivedChars[numChars];
char *chars_array = strtok(receivedChars, ",");
char *func = chars_array;

Serial.println(func);
if(func == 'c') {
    Serial.println("It works");
}

有人可以帮助我解决我出错的地方吗?

4 个答案:

答案 0 :(得分:2)

首先,strtok迭代地工作。这意味着要将字符串拆分为标记,您必须调用它直到它返回NULL:

char* token = strtok(input, ",");

while (token)
{
    ...
    token = strtok(NULL, ",");
}

第二件要知道的是,char *只是一个指向被视为字符串的内存块的指针。所以当你写下这样的东西时:

char* str = ...;
if (str == 'c')
{
    ...
}

这实际上意味着“将变量'str'指向的地址与字符'c'的ASCII码(十六进制为0x63)的值进行比较”,因此如果strtok返回的指针等于你的条件将为真到0x63,这绝对不是你想要的。

你真正需要的是strcmp函数,它按字符比较两块内存:

char* chars_array = strtok(receivedChars, ",");

if (strcmp(chars_array, "bla") == 0)
{
    // a first token is "bla"
}

答案 1 :(得分:1)

交换

if(func == 'c') {

if(func[0] == 'c') {

如果你想检查第一个字符是否是&#39; <&#39;

答案 2 :(得分:0)

&#39; FUNC&#39;是指向字符数组开头的指针;将它与字符值进行比较几乎不会产生真实。也许您想要比较该数组中的字符。

答案 3 :(得分:0)

主要问题是您应该使用if(*func == 'c') {,即取消引用指针func,而不是if(func == 'c') {。 请注意,您还应该考虑chars_array可能是空字符串,或者可能只包含','个字符;在这种情况下,strtok会产生NULL,并可能会让您的应用崩溃。因此,代码应如下所示:

if (func != nullptr) {
  Serial.println(func);
  if(*func == 'c') {
      Serial.println("It works"); 
  }
}