C Сравните массив символов фиксированного размера со строкой. - PullRequest
0 голосов
/ 27 мая 2011

Я на низкоуровневой встроенной системе, сравнивая буфер символов фиксированного размера с простой строкой. Буфер намного больше строки, поэтому я думаю, что именно поэтому операторы сравнения говорят, что они не равны. Это побудило меня написать простую функцию для сравнения строки с началом буфера - это элегантное решение? Спасибо

int CompareString(const char* string, int strlen)
{
     //first check to see if the length is the same
     //if there is a null char at string length then
     //they are equal
     if(MsgBuffer[strlen] != '\0')
     {
         return 0; //they are not equal
     }

     strlen = strlen - 1;

     while(strlen > -1)
     {
         if(string[strlen] != MsgBuffer[strlen])
         {
              return 0; //they are equal
         }

         strlen = strlen - 1;
     }

     return 1; //they are equal
}

Ответы [ 4 ]

3 голосов
/ 27 мая 2011

Обычно вы можете использовать strncmp с максимальной длиной фиксированного размера буфера.

Но, возможно, вы несколько ограничены, особенно если учесть, что работаете во встроенной среде. Он также может не подходить для сравнения строк с пробелами, где каждая строка имеет различное количество пробелов в конце (в том числе ни один для такой строки, как «формальдегид») - strncmp не будет хорошо работать для сравнения "Hello" и {'H','e','l','l','o',' ',' ',' '} если размер 8.

Если бы это было так, я бы посмотрел на что-то вроде следующего:

#include <stdio.h>

int compStr (char *s1, char *s2, size_t sz) {
    while (sz != 0) {
        // At end of both strings, equal.
        if ((*s1 == '\0') && (*s2 == '\0')) break;

        // Treat spaces at end and end-string the same.
        if ((*s1 == '\0') && (*s2 == ' ')) { s2++; sz--; continue; }
        if ((*s1 == ' ') && (*s2 == '\0')) { s1++; sz--; continue; }

        // Detect difference otherwise.
        if (*s1 != *s2) return 0;

        s1++; s2++; sz--;
    }
    return 1;
}

int main (void) {
    printf ("%d\n", compStr ("Hello", "Hello", 5));
    printf ("%d\n", compStr ("Hello", "Hello     ", 5));
    printf ("%d\n", compStr ("Hello     ", "Hello", 5));
    printf ("%d\n", compStr ("Hello     ", "Hello ", 5));
    printf ("%d\n", compStr ("HelloX", "Hello", 5));
    printf ("%d\n", compStr ("HelloX", "HelloY", 5));
    printf ("%d\n", compStr ("HelloX", "HelloY", 6));
    return 0;
}

Это будет соответствовать строкам с любым количеством пробелов в конце, вплоть до определенного размера, и имеет преимущество в том, что вы можете передавать ему произвольные буферы вместо того, чтобы предполагать, что один является глобальной областью.


Кроме того, не рекомендуется использовать стандартную библиотечную функцию, например strlen, в качестве имени переменной, так как вы можете захотеть. в какой-то момент используйте стандартную библиотеку.

1 голос
/ 27 мая 2011

Вот код, который вы можете использовать.Просто передайте строку сравнения и буфер как два параметра.Этот код также должен полностью соответствовать MISRA-C: 2004.

sint8 gpfunc_strcmp (const uint8* s1, const uint8* s2)
{

  while ((*s1 != '\0') && (*s2 != '\0'))
  {
    if (*s1 != *s2)
    {
      break;
    }
    else
    {
      s1++; 
      s2++;
    }
  }

  return (sint8)(*s1 - *s2);
}
1 голос
/ 27 мая 2011

Использование strncmp

0 голосов
/ 27 мая 2011

"Операторы сравнения"?Вы имеете в виду == и так далее?Вы не можете использовать их для сравнения строк, так как они будут сравнивать местоположения, а не содержимое.Вместо этого вы должны использовать strcmp или strncmp .

(И я думаю, что ответ на ваш настоящий вопрос таков: нет, это не элегантное решение, поскольку strncmp уже существует, но, как говорили другие, в вашей встроенной среде использование библиотеки строк может оказаться неудобным.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...