2014-12-15 1 views
5

Im ищет способ сравнения 2 массивов символов без strcmp. Это путь? Или я чего-то не хватает? Когда я скомпилировал его, если я набираю те же строки в обоих, программа застревает и ничего не сделает. ПОЖАЛУЙСТА ПОМОГИ!Компоновка массива Char без использования strcmp в C

EDIT: SORRY Намеревалось БЫТЬ я не C

int compare_info(char *array1, char *array2) 
{ 

int i; 
i = 0; 

while(array1[i] == array2[i]) 
{ 
    if(array1[i] == '\0' || array2[i] == '\0') 
     break; 
    i++; 
} 

if(array1[i] == '\0' && array2[i] == '\0') 
return 0; 

else 
    return-1; 

} 
+2

Проблема 'C++'. Har har. – wakjah

+4

Ваш первый 'while' - бесконечный цикл. Вы сравниваете 'array1 [i]' и 'array2 [i]', но тогда 'i' никогда не изменяется внутри цикла. –

+2

Где вы определяете переменную 'c'? –

ответ

3

Здесь у вас есть решение, это prety, как ваш код, но я внесла некоторые изменения. Я вытащил возвраты в середине цикла, потому что они разрушают структуру, таким образом ее легче анализировать. Отделка, я добавил новое условие в то время, так что, когда конец строки найден, цикл завершается

int compare_info(char *array1, char *array2) 
{ 
    int i; 
    int response = 0; 
    i = 0; 

    while(array1[i] == array2[i] && response == 0) 
    { 
     if(array1[i] == '\0' || array2[i] == '\0'){ 
      response = 1; 
     } 
     i++; 
    } 

    return response; 
} 
3

Здесь у вас есть решение

int compare_info(char *array1, char *array2) 
{ 
    if ((array1 == NULL) || (array2 == NULL)) 
     return 0; 
    while ((*array1 != '\0') && (*array2 != '\0') && (*array1 == *array2)) 
    { 
     array1++; 
     array2++; 
    } 
    return (*array1 == *array2); 
} 

или, возможно, вы, как это больше

int compare_info(char *array1, char *array2) 
{ 
    int i; 

    i = 0; 
    if ((array1 == NULL) || (array2 == NULL)) 
     return 0; 
    while ((array1[i] != '\0') && (array2[i] != '\0') && (array1[i] == array2[i])) 
    { 
     i++; 
    } 
    return (array1[i] == array2[i]); 
} 

вы может сделать аргументы const, было бы лучше, так как если вы хотите сравнить строки, вы гарантируете, что функция не изменяет их, я имею в виду compare_info(const char *array1, const char *array2)

+1

'strcmp()' возвращает отрицательное значение, если первый аргумент сортирует по меньшей мере по сравнению со вторым, положительное значение, если первый аргумент сортируется по-другому по сравнению со вторым, и равен нулю, если они равны. Ваше сравнение возвращает либо 0 (правильно), либо -1 (не всегда правильно). –

+0

@JonathanLeffler Он не сказал, что хочет эмулировать 'strcmp', он просто хочет, чтобы два сравнивали строки со строками, это вернет' 0', когда строки не совпадают, и, кроме того, не равно нулю, было бы легко преобразовать эти функции возвращают значение, подобное 'strcmp', но я думаю, что этот ответ решает проблему, конечно, я просто ошибаюсь. –

+1

начальные проверки параметров NULL приводят к возврату функции true (обычно определяется как «не false» или 0x01 или 0x02). Это может быть очень неверно для вызывающей программы и, вероятно, неверно, если только один из массивов указатели содержат нуль и определенно неверны как указатели массива содержат NULL – user3629249

2

В дополнении к другим ответам, я хотел бы добавить следующее к смешиванию как strcmp look- так без strcmp:

int strcmp_nohdr (char *s1, char *s2) 
{ 
    if (!s1 && !s2) return 0; 
    if (s1 && !s2) return 1; 
    if (!s1 && s2) return -1; 

    while (*s1 && *s2 && *s1 == *s2) s1++, s2++; 

    if (!*s1 && !*s2) return 0; 
    else if (*s1 > *s2) return 1; 
    else return -1; 
} 

примеры/выход:

$ strcmp_nohdr mydog mycat 

s1 is greater than s2 

$ strcmp_nohdr mybat mycat 

s1 is less than s2 

$ strcmp_nohdr mycat mycat 

s1 is equal to s2 

$ strcmp_nohdr mycat myca 

s1 is greater than s2 

$ strcmp_nohdr myca mycat 

s1 is less than s2 

Еще один alternat ive будет выполнять процедуру вызова и сборки, которая делает то же самое.

+0

'strcmp_nohdr (NULL, NULL)' разрушит все, не так ли? Не то чтобы кто-то был бы глупым, чтобы это сделать ... :-) –

+0

Можете ли вы объяснить мне этот код? : S не может получить то, что вы здесь говорите. – Silvestrini

+0

@Silvestrini Показанный код работает точно так же, как 'strcmp' (кроме' ptr> NULL' считается истинным в этом коде, если 'ptr' не' NULL'). –

0

Коротко:

int compare_info(char * array1, char * array2) 
{ 
    char * ptr1 = array1; 
    char * ptr2 = array2; 

    while(*ptr1 && *ptr2 && *ptr1++==*ptr2++); 
    if(!*ptr1 && !*ptr2 && *(ptr1-1)==*(ptr2-1)) return 0; 
    return -1; 
} 

Когда два массива такое же возвращение 0, в противном случае возврат -1. (Это не совпадает с STRCMP.)

0

Следующая функция должна имитировать точное поведение strcmp:

int compare_info(const char* array1,const char* array2) 
{ 
    int i; 
    for (i=0; array1[i]!=0 && array2[i]!=0; i++) 
    { 
     if (array1[i] > array2[i]) 
      return +1; 
     if (array1[i] < array2[i]) 
      return -1; 
    } 
    if (array1[i] != 0) 
     return +1; 
    if (array2[i] != 0) 
     return -1; 
    return 0; 
} 
1

В отличии от некоторых людей, я предпочитаю ловить нулевые указатели как можно раньше (через крах программы и отладчик), поэтому я избегаю каких-либо проверок для нулевых указателей ниже. Другими словами, не передавайте нулевой указатель на эти функции.

str_neq функция определяет, является ли строки не равны, что, кажется, правильная логика, основанная на коде (возвращение 0/ложь, если равны и -1/верно, если не равны):

int 
str_neq (const char *s1, const char *s2) 
{ 
    while (*s1 != '\0' && *s1 == *s2) 
    ++s1, ++s2; 
    return -(*s1 != *s2); 
} 

Для того, чтобы обеспечить такое же поведение, как strcmp требуется небольшое изменение в выражении, которое вычисляет возвращаемое значение:

int 
str_compare (const char *s1, const char *s2) 
{ 
    while (*s1 != '\0' && *s1 == *s2) 
    ++s1, ++s2; 
    return *s1 - *s2; 
} 

Я надеюсь, что это помогает! :-)

+0

Просто личные предпочтения, но у вас может быть еще одна причина - 'while (* s1! = '\ 0' ...' не просто просто while (* s1 ... 'Когда указатель переместится на null terminator, оба теста эквивалентны. Любая причина, по которой вы предпочитаете более длинную версию? –

+0

@ DavidC.Rankin Я предпочитаю более короткую версию, но я решил более длинную версию для ясности. –

Смежные вопросы