2015-11-10 2 views
1

У меня есть словарь слов, хранящихся в массиве 2D-символов. У меня также есть отсканированное слово, хранящееся в структуре. Я пытаюсь «уменьшить» мой основной словарь, копируя слова длины, равные сканируемому слову, в отдельный 2D-массив. Затем я хочу напечатать новый массив.Копирование строк равной длины в новую строковую строку

i.e если отсканированное слово = hello, все слова той же длины будут скопированы в новый массив.

Мой код просто печатает первое слово массива бесконечно

words.startword является отсканированное слово.

void get_equal_length (char equal_length_dictionary[MAX_WORDS][MAX_WORD_LENGTH], char dictionary[MAX_WORDS][MAX_WORD_LENGTH], Scanned_words words) 

{ 
int i, word_count = 0; 

for (i = 0; dictionary[i] != '\0'; i++) 
    { 
     if (strlen(*dictionary) == strlen(words.startword)) 
      { 
       strcpy(*equal_length_dictionary, *dictionary); 
       word_count++; 
       printf("Word #%d: %s\n", word_count, *equal_length_dictionary); 
      } 
    } 
    printf("Equal length words: %d\n", word_count); 
} 
+0

Каковы ваши флагов для компилятора? Вы должны получать предупреждение/ошибку в словаре [i]! = '\ 0'', сравнивая «char *» с программой 'char' – Kevin

+0

gcc -Wall -Werror -Wextra -std = c99 -pedantic. c " –

+3

Также вы никогда не используете' i' в своем цикле, что должно быть подсказкой к решению. – Kevin

ответ

2
for (i = 0; dictionary[i] != '\0'; i++) 
{ 
    if (strlen(dictionary) == strlen(words.startword)) 
    { 
     strcpy(*equal_length_dictionary, *dictionary); 

должно быть:

for (i = 0; dictionary[i][0] != '\0'; i++) 
{ 
    if (strlen(dictionary[i]) == strlen(words.startword)) 
    { 
     strcpy(equal_length_dictionary[i], dictionary[i]); 

Кроме того, для повышения скорости, лучше рассчитать STRLEN (words.startword) только один раз перед циклом, а не перерасчета его внутри цикл на каждой итерации. Вы также не должны забывать о завершении нового массива нулевой строкой.

Полный код будет:

void get_equal_length(char equal_length_dictionary[MAX_WORDS][MAX_WORD_LENGTH], char dictionary[MAX_WORDS][MAX_WORD_LENGTH], Scanned_words words) 
{ 
    int i, word_count = 0, len = strlen(words.startword); 

    for (i = 0; dictionary[i][0] != '\0'; i++) 
    { 
    if (strlen(dictionary[i]) == len) 
    { 
     strcpy(equal_length_dictionary[i], dictionary[i]); 
     word_count++; 
     printf("Word #%d: %s\n", word_count, equal_length_dictionary[i]); 
    } 
    } 
    // now we will also terminate the new array with a null string 
    equal_length_dictionary[i][0] = '\0'; 
    printf("Equal length words: %d\n", word_count); 
} 
+0

Почему-то этот сег неисправен? :/ –

+0

Заканчивает ли ваш словарь массив пустой строкой? Если это не будет продолжаться, попробуйте прочитать за конец массива – Kevin

+0

@Finlandia_C см. Edit plz. Фактически вы завершаете свой массив строк нулевой строкой. Чтобы проверить, есть ли у индекса i нулевая строка, используйте отредактированную проверку. Также после цикла не забудьте добавить пустую строку в ваш новый массив. Скажите мне, если у вас возникли трудности с этим: –

0

Это должно работать, хотя не проверял. Как отметил Кевин в комментарии, вам нужно использовать индекс i в цикле. Вы также должны использовать word_count в качестве индекса:

void get_equal_length (char equal_length_dictionary[MAX_WORDS][MAX_WORD_LENGTH], char dictionary[MAX_WORDS][MAX_WORD_LENGTH], Scanned_words words) 

{ 
int i, word_count = 0; 

for (i = 0; i < MAX_WORDS; i++) 
    { 
     char* cur_word = dictionary[i]; 
     if (!cur_word || !*cur_word) 
      break; 
     if (strlen(cur_word) == strlen(words.startword)) 
      { 
       strcpy(equal_length_dictionary[word_count], cur_word); 
       word_count++; 
       printf("Word #%d: %s\n", word_count, equal_length_dictionary[word_count]); 
      } 
    } 
    printf("Equal length words: %d\n", word_count); 
} 
Смежные вопросы