Поиск равных строк с помощью strcmp

У меня есть двумерный массив, содержащий реальные слова одинаковой длины (словарь). У меня также есть 2D-массив строк (в основном мусор, с некоторыми реальными словами). Я пытаюсь найти настоящие слова во втором массиве с помощью strcmp. Как только найдено реальное слово (strcmp = 0), я хочу скопировать это слово в новый массив двухмерных строк с именем actual_words, а затем распечатать его.

Однако мой, похоже, просто печатает Words which are viable: и никаких реальных слов ... хотя ошибок нет.

Все строки заканчиваются нулем.

void check_dictionary (char equal_length_dictionary[MAX_WORDS][MAX_WORD_LENGTH], char nextword[MAX_WORDS][MAX_WORD_LENGTH])

{
int arr, dict;
char actual_words[MAX_WORDS][MAX_WORD_LENGTH];

printf("\nWords which are viable: \n");

for (dict = 0; equal_length_dictionary[dict][0] != '\0'; dict++)
{
//look through each word in dictionary
    for (arr = 0; nextword[arr][0] != '\0'; arr++) 
    //look through each word in the array
        {
                if ((strcmp(equal_length_dictionary[arr], nextword[arr])) == 0) 
                //test for differences between dictionary and word
                    {
                        strcpy(actual_words[arr], nextword[arr]); 
                        //if no differences, copy words
                        printf("%s ", actual_words[arr]);
                    }
        }
}     
printf("\n");
}

person Finlandia_C    schedule 11.11.2015    source источник
comment
Слова в массивах заканчиваются нулем? (Если нет, вы должны использовать strncmp и strncpy)   -  person alain    schedule 11.11.2015
comment
@Finlandia_C Будьте осторожны с strncpy, так как он не всегда может завершать строку нулем.   -  person Some programmer dude    schedule 11.11.2015
comment
Если списки большие, было бы быстрее отсортировать оба списка, а затем сделать один проход по обоим в поисках совпадений.   -  person stark    schedule 11.11.2015


Ответы (3)


Вы используете один и тот же индекс при сравнении обоих массивов:

if ((strcmp(equal_length_dictionary[arr], nextword[arr])) == 0) 

Массив equal_length_dictionary должен использовать индекс dict, а не arr.

person this    schedule 11.11.2015
comment
Как и выше, это по-прежнему выводит ноль слов. - person Finlandia_C; 11.11.2015
comment
По приведенному вами коду невозможно определить проблему. - person this; 11.11.2015

Я думаю, это сравнение;

strcmp(equal_length_dictionary[arr], nextword[arr])

Вы используете одну и ту же переменную arr для обоих массивов. Я бы предположил, что первый массив должен быть проиндексирован dict:

strcmp(equal_length_dictionary[dict], nextword[arr])

Кроме того, обе строки должны заканчиваться нулем, иначе у вас будет неопределенное поведение. Если строки не завершаются нулем, вам нужно использовать вместо них strncmp (или, возможно, memcmp).

person Some programmer dude    schedule 11.11.2015
comment
Это по-прежнему выводит ноль слов. Я добавил, что все они являются строками с нулевым завершением в основном вопросе. - person Finlandia_C; 11.11.2015
comment
@Finlandia_C Возможно, пришло время использовать отладчик и пройтись по коду строка за строкой, чтобы увидеть, что происходит и каковы строки на самом деле. Помните, что strcmp чувствителен к регистру и что пробелы в строках также сравниваются (и пробелы включают в себя табуляцию, а также новые строки, которые, например, fgets включают в строки, которые он читает). При желании распечатайте обе строки внутри кавычек, чтобы убедиться, что они действительно равны. - person Some programmer dude; 11.11.2015
comment
Я использовал fscanf для чтения строк вместо fgets. Думаю, пора научиться пользоваться отладчиком! - person Finlandia_C; 11.11.2015

Не видя сравниваемых слов, у меня есть одно предположение: 1. Есть начальные или конечные пробелы, о которых вы не знаете. Попробуйте распечатать строки с разделителями в операторе печати, чтобы вы могли легко увидеть, есть ли какие-либо пробелы, которые необходимо обрезать.

person nicomp    schedule 11.11.2015