2015-09-04 2 views
3

Я тестирую небольшую программу, которая в основном сравнивает, идентичны ли две строки ввода (как это делает strcmp). Однако я продолжаю получать результат, говоря, что 2 строки различны, несмотря ни на что. Если кто-то может заметить некоторые ошибки, я бы оценилСравните 2 строки в C

int comp(char str1[], char str2[]) { 
    int i = 0; 
    while (str1[i] == str2[i]) { 
     if (str1[i] == '\0' || str2[i] == '\0') 
      break; 
     i++; 
    } 
    if (str1[i] == '\0' && str2[i] == '\0') 
     return 0; 
    else 
     return -1; 
} 


int main(int argc, char * * argv) { 
    int cmp; 
    char str1[1000], str2[1000]; 
    cmp = comp(str1, str2); 
    if (cmp == 0) 
     printf("The two strings are identical.\n"); 
    else 
     printf("The two strings are different.\n"); 
    return 0; 
} 
+6

Содержимое массивов 'str1 [1000], str2 [1000]' никогда не устанавливается. Мы даже не можем быть уверены, что они имеют нулевое завершение символа. – chux

+0

Кажется, вы возвращаете '-1' за' false', '0' за' true'. Для совместимости со стандартом: ** не **! Используйте стандартные логические значения: '0' для' false, '1' для' true'. – Olaf

+0

* Всегда * правильно инициализировать переменные * перед тем, как читать их. – alk

ответ

8

Ваша функция works just fine. Единственная проблема заключается в том, что ваши два массива символов не инициализированы и что вызывает неопределенное поведение.

+0

Чтобы дать немного больше информации о форексе здесь - когда ваш код запущен, в стеке будут выделены> = 2000 байт для 'str1' и' str2'; это означает, что указатель стека будет уменьшен на> = 2000 байт, а указатель на каждую переменную будет сохранен в двух регистрах (один для 'str1', один для' str2'). Поскольку вы фактически не инициализируете их, * все, что хранится в этих> = 2000 байт в стеке *, технически являются «значениями» в массивах. Что там? Кто знает, это всего лишь черный ящик случайных байтов, пока вы не сообщите процессу что-то хранить в памяти. – DIMMSum

+0

Спасибо. Я хочу сравнить 2 строки ввода от пользователей, поэтому я оставил ее неинициализированной. Я бы хотел сделать что-то вроде './a.out equal equal', чтобы проверить его, должен ли я делать' scanf («% s% s», str1, str2); '? – Walle

+0

«* .. должен ли я делать« лучше »scanf (% 999s% 999s, str1, str2);', чтобы избежать переполнения буферов с помощью ввода пользователя, да. – alk

0

вот одна реализация, используя параметры командной строки.

#include <stdio.h> 
#include <stdlib.h> 

int comp(char str1[], char str2[]) 
{ 
    int i = 0; 
    while (str1[i] == str2[i]) 
    { 
     if (str1[i] == '\0' || str2[i] == '\0') 
      break; 
     i++; 
    } 

    if (str1[i] == '\0' && str2[i] == '\0') 
     return 0; 
    else 
     return -1; 
} 


int main(int argc, char * * argv) 
{ 
    if(3 != argc) 
    { 
     printf("USAGE: %s, firstString secondString\n", argv[0]); 
     exit(EXIT_FAILURE); 
    } 

    // implied else, correct number of parameters 

    if (!comp(argv[1], argv[2])) 
     printf("The two strings are identical.\n"); 
    else 
     printf("The two strings are different.\n"); 
    return 0; 
}