strcmp неправильно ведет себя с двумя одинаковыми строками

У меня есть этот код:

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

int main() {

  char s1[50], s2[50];

  printf("write s1:\n");
  fgets(s1, sizeof(s1), stdin);

  printf("s2:\n");
  fgets(s2, sizeof(s2), stdin);

  printf("The concatenation of the two strings: %s\n", strcat(s1, s2));

  if( strcmp(s2, s1) < 0 ) {
    printf("s2 is shorter than s1.\n");
  } else if( strcmp(s2, s1) > 0 ) {
    printf("s2 is longer than s1.\n");
  } else {
    printf("strings are equal.\n");
  }

  return 0;
}

Проблема в том, что когда я пишу две одинаковые строки, такие как abc или что-то еще, strcmp возвращает «s2 короче, чем s1».

Это нормальный результат или я что-то не так сделал? Если да, то где?

Или strcat делает строку не равной? Можно ли что-нибудь с этим сделать?

Спасибо


person zeeks    schedule 28.09.2015    source источник
comment
см. возвращаемое значение раздела strcmp. возвращаемое значение относится только к первому различию (ничего общего со сравнением общей длины). если вы хотите сравнить длину строк, используйте strlen..   -  person amdixon    schedule 28.09.2015
comment
да. strcmp возвращает ненулевое число, если в коде есть strcat. когда я это комментирую, то strcmp возвращает 0   -  person zeeks    schedule 28.09.2015
comment
s1 = abcabc и s2 = abc, сравнение делает s2 короче, чем s1.   -  person Sunil Bojanapally    schedule 28.09.2015
comment
так что код в порядке, и это должен быть правильный ответ?   -  person zeeks    schedule 28.09.2015


Ответы (4)


Ты делаешь

 strcat(s1, s2)

прежде чем сравнивать. Что изменит строку s1, поэтому строки не будут равны

person Gopi    schedule 28.09.2015

вы делаете strcat перед выполнением strcmp. strcat объединит s2 с s1

person Karthick    schedule 28.09.2015

Strcmp сравнивает строки по значению их содержимого (аналогично порядку словаря, если хотите, но не совсем так), а не по их длине.

Например: "abc" > "abb"

person rghome    schedule 28.09.2015

Попробуйте заменить

    printf("The concatenation of the two strings: %s\n", strcat(s1, s2));

с

    printf("The two strings are: '%s' and '%s' and their concatenation: '%s'\n",
    s1, s2, strcat(s1, s2));

Затем прочитайте описание strcat.

Если это не поможет, замените последовательности %s на %p. (Возможно, вам придется прочитать описание спецификатора формата %p в документации printf.)

person CiaPan    schedule 28.09.2015