2015-01-04 3 views
0

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

#define SIZE 256 
void paintWords(char **words, int count_words); 

void main() { 
    char **words = NULL; 
    int flag = 1; 
    char buffer[SIZE]; 
    int count_words = 0; 
    char *curr_word; 
    while (flag) 
    { 
     _flushall(); 
     printf("Enter a word:"); 
     gets(buffer); 
     words = (char**)realloc(words,++count_words*sizeof(char*)); 
     curr_word = (char*)malloc(strlen(buffer) + 1); 
     words[count_words - 1] = curr_word; 
     printf("Do you wish to continue(0-no, 1-yes):"); 
     scanf("%d", &flag); 
    } 
    paintWords(words, count_words); 
} 

void paintWords(char **words, int count_words) { 
    int j = 0; 
    for (int i = 0; i < count_words; i++) 
    { 
     printf("%s\n", words[i][j]); 
    } 
} 
+1

'недействительным main' Уч .... – Ankur

ответ

0
  1. Скопируйте buffer в свой «эд блок malloc с strcpy

    strcpy(curr_word, buffer); 
    

    вы выбрасываете слово для чтения, так как вы не ставите его нигде

  2. Не использовать getsfgets вместо

    fgets(buffer, sizeof(buffer), stdin); 
    

    Это предотвратит переполнение буфера.

  3. Это только j улицы в вашем случае является 0-й символом слова

    printf("%s\n", words[i][j]); 
    

    изменений его

    printf("%s\n", words[i]); 
    

    предупреждений очереди компилятора, она расскажет вам о printf, ожидая char * и получая вместо этого char.

Также рассмотреть следующие:

  1. main() должен вернуть int.
  2. Вам не нужно набрасывать malloc.
  3. Не перезаписывайте указатель realloc, используйте временный указатель и назначьте его array только с успехом. В противном случае, если realloc возвращает NULL, вы не сможете использовать free(array).
+0

Данный код даже не компилируется ... Также мы должны использовать 'free' – Ankur

+0

. Ваш strcpy() неправильно исправить. word - это двойной указатель, указатель - это слово [idx] – Gopi

0
++count_words 
words = realloc(words,count_words*sizeof(char*)); 
words[count_words-1] = malloc(strlen(buffer) + 1); 

strcpy(words[count_words-1],buffer); 

Позже напечатать массив

printf("%s\n",words[i]); 

realloc() может потерпеть неудачу так

char *temp = realloc(words,count_words*sizeof(char*)); 

if(temp != NULL) 
words = temp; 

Несколько других исправлений будет

Вы не должны использовать gets что нет более стандартный. Используйте fgets() и обратите внимание, что fgets() поставляется с новой строки

Проверьте код ниже:

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

#define SIZE 256 
void paintWords(char **words, int count_words); 

void main() { 
    char **words = NULL,ch; 
    int flag = 1; 
    char buffer[SIZE]; 
    int count_words = 0; 
    //char *curr_word; 
    while (flag) 
    { 

     printf("Enter a word:"); 
     fgets(buffer,sizeof(buffer),stdin); 

     words = (char**)realloc(words,++count_words*sizeof(char*)); 

     words[count_words - 1] = (char*)malloc(strlen(buffer) + 1); 
     strcpy(words[count_words-1],buffer); 
     printf("Do you wish to continue(0-no, 1-yes):"); 
     scanf("%d", &flag); 
     while((ch = getchar()) != '\n'); 
    } 
    paintWords(words, count_words); 
} 

void paintWords(char **words, int count_words) { 
    int i; 
    for (i=0; i < count_words; i++) 
    { 
     printf("%s", words[i]); 
    } 
} 
Смежные вопросы