2015-11-15 5 views
0

У меня возникли проблемы с работой со строками и строковыми массивами и с правильной использованием strcpy. Я использую словарь слов, отсканированных в 2D-массиве dictionary. Затем я беру начальное слово, изменяю каждую букву, чтобы создать множество разных вариантов, то есть cat -> cbt, cct, cdt и т. Д. Оттуда я копирую каждое сгенерированное слово в 2D-массив и сравнивая эти сгенерированные слова со словарем, чтобы увидеть, являются ли они реальными словами , Затем я хочу напечатать эти реальные слова, т. Е. cat в качестве стартового слова будет генерировать bat, если его в словаре, но zat не будет. Когда я запускаю код, он печатает все сгенерированные слова, но когда он добирается до check_dictionary, функция не печатает никаких слов.Проблемы с строковыми массивами, strcpy и строками

Текстовый файл считывает данные из, как:

mat 
yes 
cat 
hat 

Код:

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

#define MAX_WORDS 20000 
#define MAX_WORD_LENGTH 30 
#define ARGS_REQUIRED 2 

typedef struct scanned_words 
{ 
    char startword[MAX_WORD_LENGTH]; 
    char endword[MAX_WORD_LENGTH]; 
} Scanned_words; 

Scanned_words scan_two_words(Scanned_words words); 
void get_next_word(Scanned_words words, 
    char parentwords[MAX_WORDS][MAX_WORD_LENGTH]); 
void read_file(char * argv[], char dictionary[MAX_WORDS][MAX_WORD_LENGTH]); 
void check_dictionary(char dictionary[MAX_WORDS][MAX_WORD_LENGTH], 
    char parentwords[MAX_WORDS][MAX_WORD_LENGTH]); 
void usage(char * argv[]); 

int main(int argc, char * argv[]) 
{ 
    char dictionary[MAX_WORDS][MAX_WORD_LENGTH]; 
    char nextword[MAX_WORDS][MAX_WORD_LENGTH]; 
    char parentwords[MAX_WORDS][MAX_WORD_LENGTH]; 
    Scanned_words words; 

    if (argc == ARGS_REQUIRED) 
    { 
    system("clear"); 
    read_file(&argv[1], dictionary); 
    words = scan_two_words(words); 
    get_next_word(words, parentwords); 
    check_dictionary(dictionary, parentwords); 
    } 
    else 
    { 
    usage(&argv[0]); 
    } 

    return 0; 
} 

void read_file(char * argv[], char dictionary[MAX_WORDS][MAX_WORD_LENGTH]) 
//reads the text file and stores the dictonary as a 2D array 
{ 
    FILE * file_name; 
    int word_count = 0, i; 

    if ((file_name = fopen(argv[0], "r")) == NULL) 
    { 
    printf("Cannot open file ... \n"); 
    } 
    while (fscanf(file_name, "%s", dictionary[i++]) == 1) 
    { 
    printf("%s ", dictionary[word_count]); 
    word_count++; 
    } 

    printf("\n"); 
    printf("\n%d words scanned in from: %s\n\n", word_count, argv[0]); 
} 

Scanned_words scan_two_words(Scanned_words words) 
//takes an empty structure, scans both words in and returns them in the same structure 
{ 
    printf("Enter the start word: \n"); 
    scanf("%s", words.startword); 
    printf("\nEnter the end word: \n"); 
    scanf("%s", words.endword); 
    printf("\n"); 

    return words; 
} 

void get_next_word(Scanned_words words, 
    char parentwords[MAX_WORDS][MAX_WORD_LENGTH]) 
//get all eligible second words from original start word 
{ 
    char character; 
    char currentword[MAX_WORD_LENGTH]; 
    int i; 

    strcpy(currentword, words.startword); 

    for (i = 0; currentword[i] != '\0'; i++) 
    { 
    strcpy(currentword, words.startword); 
    for (character = 'a'; character <= 'z'; character++) 
    { 
     currentword[i] = character; 
     strcpy(parentwords[i], currentword); 
     printf("%s ", parentwords[i]); 
    } 
    } 
    parentwords[i][0] = '\0'; 

    printf("\n\n"); 
} 

void check_dictionary(char dictionary[MAX_WORDS][MAX_WORD_LENGTH], 
    char parentwords[MAX_WORD_LENGTH][MAX_WORD_LENGTH]) 
//checks a generated word for eligibility against the dictionary, prints next generation words 
{ 
    int i, j; 

    printf("\nSecond words: \n\n"); 

    for (j = 0; parentwords[j][0] != '\0'; j++) 
    ; 
    { 
    for (i = 0; dictionary[i][0] != '\0'; i++) 
    { 
     if ((strcmp(dictionary[i], parentwords[j])) == 0) 
     { 
     printf("%s \n", parentwords[j]); 
     } 
    } 
    } 
} 

void usage(char * argv[]) 
//prints error message 
{ 
    printf("Incorrect usage, try: ./program_name %s\n", argv[1]); 
} 
+2

отступы зверские ... И вы должен выполнить собственную отладку. Если 'check_dictionary' ничего не печатает, то код внутри циклов, скорее всего, не будет выполнен. Распечатайте переменные, которые вы используете в качестве условий, и посмотрите, почему. – szczurcio

+0

Почему? переменные arent't с отступом, петли с отступом с одной вкладкой и вкладкой +1 дальше. Другие строки кода заключаются в скобки. –

+0

Проблема в том, что, когда я копирую сгенерированное слово в 2D-массив, он не делает этого, но я не уверен, почему. –

ответ

1

форматирования показал следующее:

for (j = 0; parentwords[j][0] != '\0'; j++) 
; 

который наиболее вероятно, должен был be:

for (j = 0; parentwords[j][0] != '\0'; j++) 

Здесь

while (fscanf(file_name, "%s", dictionary[i++]) == 1) 

в i используются неиницализированные

Таким образом изменить его определение включить инициализацию:

int word_count = 0, i = 0; 
+1

Итак, когда следующая (предположительно?) Вложенная петля 'i' итерации,' j' была вне диапазона. –

+0

@WeatherVane ... и с этим вызывается позорное Undefined Behavior, и с этого момента все может случиться. – alk

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