Реализация memcmp C - любые логические ошибки с этим - PullRequest
0 голосов
/ 01 мая 2009

реализация memcmp C - есть логические ошибки с этим?

Я искал реализацию memcmp (), я нашел этот фрагмент кода, но он четко пометил, что с фрагментом кода есть 1 логическая ошибка. Не могли бы вы помочь мне найти логическую ошибку.

По сути, я тестировал этот код на уровне реализации библиотеки mem.mpmp () библиотеки string.h с разными входами, но ожидаемый результат всегда совпадает с библиотечной версией функции.

Вот фрагмент кода:

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

int memcmp_test(const char *cs, const char *ct, size_t n)
{
  size_t i;   

  for (i = 0; i < n; i++, cs++, ct++)
  {
    if (*cs < *ct)
    {
      return -1;
    }
    else if (*cs > *ct)
    {
      return 1;
    }
    else
    {
      return 0;
    }
  }
} 



int main()
{
    int ret_val = 20; //initialize with non-zero value 

    char *string1 = "china";
    char *string2 = "korea";

    ret_val = memcmp_test(string1,string2,5); 

    printf ("ret_val is = %d",ret_val);

    getchar();
    return 0;
}

Я запустил программу с двумя примерами строк, и программа вернулась бы сразу после сравнения первых символов двух строк. ret_val равен -1 в вышеприведенном случае.

Определение memcmp (), которому должен соответствовать приведенный выше фрагмент кода:

Определение функции библиотеки C: memcmp: int memcmp (const char * cs, const char * ct, size_t n)

Сравните первые n символов cs с первыми n символами ct. Вернуть <0, если cs <ct. Вернуть> 0, если cs> ct. Вернуть 0, если cs == ct.

Определенно, в ЛОГИЧЕСКОЙ ошибке есть ошибка, не могли бы вы помочь мне ее найти.

Ответы [ 6 ]

8 голосов
/ 01 мая 2009

Как написано сейчас, этот код будет проверять только первый байт входных данных. else return 0 необходимо вывести из цикла, оставив return 0 в конце:

  for (i = 0; i < n; i++, cs++, ct++)
  {
    if (*cs < *ct)
    {
      return -1;
    }
    else if (*cs > *ct)
    {
      return 1;
    }
  }
  return 0;
 } 
7 голосов
/ 01 мая 2009

Я полагаю, поскольку char подписанность определяется реализацией, вы можете сделать сравнение unsigned:

int memcmp_test(const char *cs_in, const char *ct_in, size_t n)
{
  size_t i;  
  const unsigned char * cs = (const unsigned char*) cs_in;
  const unsigned char * ct = (const unsigned char*) ct_in;

  for (i = 0; i < n; i++, cs++, ct++)
  {
    if (*cs < *ct)
    {
      return -1;
    }
    else if (*cs > *ct)
    {
      return 1;
    }
  }
  return 0;
} 
4 голосов
/ 01 мая 2009

Посмотри на свой цикл. Это только изучение одного персонажа.

3 голосов
/ 01 мая 2009

Строго говоря, подпись неверна. правильный один:

int memcmp(const void *s1, const void *s2, size_t n);

Ваш код сравнивает c и k и, обнаружив, что c меньше k, покорно возвращает -1. Однако, если бы эти два были равны, вы бы получили неверный результат, так как возвращаетесь рано.

Если вы прочитаете документацию, вы найдете:

Знак ненулевого возвращаемого значения должен определяться знаком разности между значениями первой пары байтов (оба интерпретируются как тип unsigned char), которые отличаются в сравниваемых объектах

Что в основном означает, что вы поступаете правильно, возвращая что-то, что сохраняет знак ('c' - 'k').

Более простую реализацию можно найти здесь .

1 голос
/ 01 мая 2009

возврат 0; происходит только после сравнения первого символа. Он должен быть размещен вне петли.

0 голосов
/ 09 мая 2013

Этот фрагмент отлично подходит для меня !!

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

int memcmp_test(const char *cs, const char *ct, size_t n)
{
 size_t i;   

 for (i = 0; i < n; i++, cs++, ct++)
 {
if (*cs < *ct)
{
  return -1;
}
else if (*cs > *ct)
{
  return 1;
}
}

  return 0;  
  } 
int main()
{
int ret_val = 20; //initialize with non-zero value 
const char *string1 = "DWgaOtP12df0";
const char *string2 = "DWGAOTP12DF0";
ret_val = memcmp_test(string1,string2,5);
printf ("ret_val is = %d",ret_val);
getchar();
return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...