Проверка, существует ли \ n в строке - C - PullRequest
0 голосов
/ 02 марта 2012

Я пытаюсь сравнить две строки, и хотя они выглядят одинаково, я не нашел совпадения.Оказывается, одна строка содержит \ n.

Так что мой вопрос - это способ проверить, содержит ли строка '\ n'?Я использую функцию strcmp;

char *tempData;
char *checkThis;
tempData = "Hello \n";
checkThis = "Hello";
if(strcmp(tempData, checkThis) == 0)
{
  printf("Match");
}

Ответы [ 3 ]

2 голосов
/ 02 марта 2012

Создайте свою собственную функцию сравнения, которая игнорирует \n или любой другой символ, который вы передаете:

int strcmp_ignoring_char(const char* s1, const char* s2, const char ignore)
{
   while ( *s1 != '\0' && *s1 != '\0' )
   {
      if ( *s1 == ignore )
      {
          s1++;
          continue;
      }

     if ( *s2 == ignore )
      {
          s2++;
          continue;
      }

      if ( *s1 != *s2 )
          return *s1 > *s2 ? 1 : -1;

      s1++;
      s2++;
   }

   /* modified to account for trailing ignore chars, as per Lundin comment */

   if ( *s1 == '\0' && *s2 == '\0' )
      return 0;

   const char* nonEmpty = *s1 == '\0' ? s2 : s1;
   while ( *nonEmpty != '\0' )
       if  ( *nonEmpty++ != ignore )
       return 1;

   return 0;
}

Таким образом, вы не будете сканировать строки дважды.

Вытакже может создать вариант, который игнорирует строку, а не один символ:

int strcmp_ignoring_char(const char* s1, const char* s2, const char* ignore)
2 голосов
/ 02 марта 2012

Вы можете удалить пробел перед сравнением, тогда вам не нужно проверять '\ n'. Но вместо этого вы можете просто сравнить строки, предполагая, что это то, что вы хотите сделать.

На этот вопрос есть несколько ответов о том, как это сделать в C.

0 голосов
/ 02 марта 2012

Вот моя попытка. Я пытался сделать его совместимым с MISRA-C, за исключением функций C99.

#include <stdint.h>
#include <stdbool.h>
#include <ctype.h>
#include <stdio.h>


int8_t strcmp_ignore_space (const uint8_t* s1, const uint8_t* s2)
{
  while ((*s1 != '\0') && (*s2 != '\0'))
  {
    bool space1 = isspace(*s1);
    bool space2 = isspace(*s2);

    if(space1)
    {
      s1++;
    }
    if(space2)
    {
      s2++;
    }

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

  if(*s1 != '\0')                      // remove trailing white spaces
  {
    while(isspace(*s1))
    {
      s1++;
    }
  }

  if(*s2 != '\0')                      // remove trailing white spaces
  {
    while(isspace(*s2))
    {
      s2++;
    }
  }

  return (int8_t)( (int16_t)*s1 - (int16_t)*s2 );
}


int main()
{
  // obscure strings with various white space characters, but otherwise equal
  if(strcmp_ignore_space("  He\vllo \n",
                         "\r He\fll o ") == 0)
  {
    printf("Same\n");
  }
  else
  {
    printf("Different\n");
  }


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