2016-12-04 6 views
1

Я работаю над проблемой из текста «C programming an Modern Approach 2nd Edition». Я хочу написать программу, которая записывает самые маленькие и самые большие слова. Программа перестает принимать входные данные, когда пользователь вводит 4-буквенное слово.C сохранение строк в массив

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

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

#define WORD_LEN 20 

int main() 
{ 
    char word[WORD_LEN]={0},ch; 
    char *a[10]={};   //Max 10 words in the array 
    int i=0,j; 

    for(;;) 
    { 
     printf("Enter a word: "); 
     fgets(word,WORD_LEN,stdin); 
     strtok(word, "\n");    //removes newline 

     a[i] = word; 
     if(strlen(word) == 4)   //if word is 4 characters 
      break;      //break out of loop 

     i++; 
    } 

    for(j=0;j<i;j++)      //displaying array 
     printf("%s\n",a[j]); 

    return 0; 
} 

Выход:

Enter a word: Analysis 
Enter a word: Martin 
Enter a word: Jonathan 
Enter a word: Dana 
Dana 
Dana 
Dana 

Любая идея в то, что я делаю неправильно? Благодарю.

+2

'а [I] = слово;': Вы можете установить одинаковые по 'Адресная слово' к' а [я] ' – BLUEPIXY

ответ

2

Как упоминалось в BLUEPIXY, вы сохраняете один и тот же адрес во всех [i] s. Поэтому в конце цикла он печатает последний вывод i раз.

Решение: Вам необходимо выделить память для [i] и скопировать строки.

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

#define WORD_LEN 20 
#define MAX_NUM_WORD 10 //Max 10 words in the array 

int main() 
{ 
    char word[WORD_LEN]={0},ch; 
    char *a[MAX_NUM_WORD]={0};    
    int i=0,j; 

    for(;;) 
    { 
     printf("Enter a word: "); 
     fgets(word,WORD_LEN,stdin); 
     strtok(word, "\n");    //removes newline 

     a[i] = malloc(sizeof(char)* (strlen(word)+1)); //1 for '\0' 

     strcpy(a[i], word); 

     i++; 
     if(strlen(word) == 4)   //if word is 4 characters 
      break;      //break out of loop 

     //i++; //You will be missing last 4 letter word if i++ is here. 
     if(MAX_NUM_WORD <= i) //You can store only MAX_NUM_WORD strings 
      break; 
    } 

    for(j=0;j<i;j++)      //displaying array 
     printf("%s\n",a[j]); 

    //Your other code. 

    for(i=0; i<MAX_NUM_WORD && NULL != a[i]; i++) 
     free(a[i]); //Free the allocated memory. 

    return 0; 
} 
1

Добавление других ответов, при использовании malloc для выделения памяти для строк, это хорошо, чтобы также проверить возвращаемое значение void* указатель, возвращаемый из него.

Кроме того, также можно проверить возвращаемое значение fgets, просто чтобы быть супер безопасным.

Это решение демонстрирует следующие моменты:

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

#define WORD_LEN 20 
#define MAX_NUM_WORD 10 
#define EXIT_LEN 4 

int 
main(void) { 
    char word[WORD_LEN]; 
    char *a[MAX_NUM_WORD]; 
    int i = 0, wrd; 

    while (i < MAX_NUM_WORD) { 
     printf("Enter a word: "); 
     if (fgets(word, WORD_LEN, stdin) != NULL) { 
      word[strlen(word)-1] = '\0'; 
     } 

     a[i] = malloc(strlen(word)+1); 
     if (a[i] == NULL) { 
      fprintf(stderr, "%s\n", "Malloc Problem"); 
      exit(EXIT_FAILURE); 
     } 

     strcpy(a[i], word); 

     i++; 

     if (strlen(word) == EXIT_LEN) { 
      break; 
     } 

    } 

    // Print and free, all at once. 
    for (wrd = 0; wrd < i; wrd++) { 
     printf("%s\n", a[wrd]); 
     free(a[wrd]); 
     a[wrd] = NULL; 
    } 

    return 0; 
} 
Смежные вопросы