strncmp在解析器函数中失败

时间:2014-01-31 10:20:30

标签: c embedded

我在parse()函数中找不到问题。简介: 我从我的终端程序发送“boot \ r \ n”,调用parse()函数,strncmp(缓冲区,“启动”,4)永远不会进入if分支? 此刻,我看不到树木的木材。 之后,从parse()函数返回的字符串将被提供给remove_cr_lf_chars()函数。我需要删除这些字符才能将字符串与图像名称进行比较,当然这些字符没有任何'\ r'或'\ n'字符。

static char *parse(void)
{
    static char buffer[100];
    char *p = buffer;
    char c;

    do {
        while (!(USART1->SR & USART_FLAG_RXNE));
        *p++ = c = ((char)USART1->DR);
    } while (c != '\r' && p-buffer < sizeof buffer-1);
    *p = '\0';

    if (strncmp(buffer, "boot", 4))
    {
        p = buffer+4;
        /* skip to argument, p might point to '\0' if none */
        while (*p != '\0' && (*p == ' ' || *p == '\r')) p++;
            return p;
    }
    return NULL;
}

static void remove_cr_lf_chars(char *dst)
{
    for (; *dst != '\0'; dst++)
        if (*dst != '\r' && *dst != '\n') dst++;
    *dst = '\0';
}

3 个答案:

答案 0 :(得分:7)

这是因为strncmp在匹配时返回0。你需要改变你的状况:

if (!strncmp(buffer, "boot", 4)) ... // Means "if buffer is equal to "boot" "
  

返回值   返回一个整数值,表示字符串之间的关系:   零值表示两个字符串中比较的字符形成相同的字符串。   大于零的值表示不匹配的第一个字符在str1中的值大于在str2中的值;小于零的值表示相反。

答案 1 :(得分:3)

如果两个比较的字符串相等,则

strncomp返回0。因此,您需要在第13行修改您的条件。例如,您可以写:

if ( strncmp(buffer, "boot", 4) == 0)

答案 2 :(得分:1)

匹配时strcmpstrncmp返回0

您应该使用if (!strncmp(buffer, "boot", 4))