Почему мое сравнение строк не удается? - PullRequest
2 голосов
/ 01 ноября 2010

Допустим, у меня есть следующий код и вывод:

for (j = 0; j <= i; j++) 
    printf("substring %d is %s\n", j, sub_str[j]);

Вывод:

substring 0 is max_n=20
substring 1 is max_m=20

Теперь я хочу напечатать только некоторые подстроки.Однако, если я попытаюсь сделать это условно:

for (j=0; j <=i; j++) {
   if (sub_str[j] == "max_n=20") {
      printf("substring %d is %s\n", j, sub_str[j]);
   }
}

, я вообще ничего не получу.Что не так с моим кодом?

Ответы [ 4 ]

6 голосов
/ 01 ноября 2010

Вы не можете использовать == для сравнения строк в C. Вы должны использовать strcmp.

for (j=0; j<=i; j++) { 
   if (strcmp(sub_str[j], "max_n=20") == 0) { 
      printf("substring %d is %s\n", j, sub_str[j]); 
   } 
} 
5 голосов
/ 01 ноября 2010

Вы не можете сравнивать строки в C с оператором ==.Вам необходимо использовать функцию strcmp или strncmp .

3 голосов
/ 01 ноября 2010

Убедитесь, что вы используете strncmp, а не strcmp.strcmp глубоко небезопасен .

BSD-страницы (хотя любой nix даст вам эту информацию):

man strncmp

int strncmp(const char *s1, const char *s2, size_t n);

Функции strcmp () и strncmp () лексикографически сравниваютстроки с нулевым символом в конце s1 и s2.

Функция strncmp () сравнивает не более n символов.Поскольку strncmp () предназначен для сравнения строк, а не двоичных данных, символы, которые появляются после символа `\ 0 ', не сравниваются.

strcmp () и strncmp () возвращают целое число больше чем, равноеили меньше 0, так как строка s1 больше, равна или меньше строки s2.Сравнение выполняется без знака, поэтому \200' is greater than \ 0 '.

From: http://www.codecogs.com/reference/c/string.h/strcmp.php?alias=strncmp

#include <stdio.h>
#include <string.h>

int main()
{
  // define two strings s, t and initialize s
  char s[10] = "testing", t[10];

  // copy s to t
  strcpy(t, s);

  // test if s is identical to t
  if (!strcmp(s, t))
    printf("The strings are identical.\n");
  else
    printf("The strings are different.\n");

  return 0;
}
2 голосов
/ 01 ноября 2010

Вы можете использовать strncmp:

if (!strncmp(sub_str[j], "max_n=20", 9)) {

Обратите внимание, что 9 - это длина строки сравнения плюс конечная '\0'.strncmp немного безопаснее, чем strcmp, потому что вы указываете, сколько сравнений будет сделано не более.

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