2017-01-24 4 views
0

Я пытался реализовать функцию strcmp, что находится внутри «string.h» Библиотека в С. Это то, что я сделал:Как реализовать STRCMP функцию string.h в C

int myStrCmp(char str1[], int len1, char str2[], int len2) 
{ 
    int i = 0; 
    int stop = 0; 
    int cmp = 0; 
    for (i = 0; i < len1 && !stop; i++) 
    { 
     if (str1[i] == str2[i]) 
     { 
      cmp = 0; 
     } 
     else if (str1[i] > str2[i]) 
     { 
      cmp = -1; // gives 1 if string 1 will be appear first in dictionary. 
      stop = 1; // stops the loop. 
     } 
     else 
     { 
      cmp = 1; 
      stop = 1; 
     } 
    } 
    return cmp; 
} 

Все нормально , но некоторые случаи ввода для строк не работают. В качестве примера:

str1 = "ab"; 
str2 = "abcd"; 

Как это исправить?

+3

Это не то, что выглядят параметры реального 'strcmp' - он принимает две строки с нулевым завершением без длин. – interjay

+1

Хмм 'len2' не используется. Для чего это? – chux

+0

В этом проблема с len2 –

ответ

0

Я принимаю len1 и len2 - это длина str1 и str2 соответственно.

В коде вы не используете len2, что вызывает логические ошибки и может вызвать сбой (segmentation fault).

После кода, решение может быть:

int myStrCmp(char str1[], int len1, char str2[], int len2) 
{ 
    int i = 0; 
    int stop = 0; 
    int cmp = 0; 
    for (i = 0; i < len1 && i < len2 && !stop; i++) 
    { 
     if (str1[i] > str2[i]) 
     { 
      cmp = -1; // gives 1 if string 1 will be appear first in dictionary. 
      stop = 1; // stops the loop. 
     } 
     else if (str1[i] < str[i] 
     { 
      cmp = 1; 
      stop = 1; 
     } 
    } 

    if (!stop && len1 != len2) 
    { 
     if (str[i] == '\0') 
     { 
      cmp = -1; 
     } 
     else 
     { 
      cmp = 1; 
     } 
    } 

    return cmp; 
} 

Тогда, даже этот код работает, он имеет очень плохой стиль (и низкая производительность). Я предлагаю вам взглянуть на реализацию Apple, функции STRCMP:

int strcmp(const char *s1, const char *s2) 
{ 
    for (; *s1 == *s2; s1++, s2++) 
     if (*s1 == '\0') 
      return 0; 
    return ((*(unsigned char *)s1 < *(unsigned char *)s2) ? -1 : +1); 
} 

https://opensource.apple.com/source/Libc/Libc-262/ppc/gen/strcmp.c

0

Прежде всего, это не так, как strcmp работает, и это не те ценности, которые он возвращает. Хотя большинство реализаций даст вам -1, 0 и 1, то ISO standard говорит, что это:

Функция зЬгстр возвращает целое число больше, равно или меньше нуля, соответственно, как строка, на которую указывает s1 является больше, равно или меньше строки, на которую указывает s2

Это означает, что это не обязательно должно быть -1, 0 и 1. Вы можете ожидать любое целое число. Это делает реализацию простой.

int mystrcmp(const char *s1, const char *s2) 
{ 
    int diff; 

    while(1) 
    { 
     diff = *s1 - *s2; 

     if(*s1 == '\0' || *s2 == '\0') 
     { 
      break; 
     } 

     s1 ++; 
     s2 ++; 
    } 

    return diff; 
} 
Смежные вопросы