2015-03-10 4 views
1
char *buffer;  /* holds the file contents. */ 
char **transfer; 
unsigned long countNewLine = 0; 
size_t rowTrack; 
size_t columnTrack; 

// assume countNewLine is 12 

buffer_size = BUFSIZ; 
buffer = malloc(buffer_size); 
transfer = (char**)malloc(sizeof(char*)*sizeof(countNewLine)); 

columnTrack = 0; 


while (columnTrack < countNewLine) { 

    for (rowTrack = 0; buffer[rowTrack] != '\n' || buffer[rowTrack] != '\0'; rowTrack++) 
     transfer[columnTrack][rowTrack] = buffer[rowTrack]; 

     columnTrack++; 
} 

Я пытаюсь преобразовать 1D строковый массив в 2D. Я не имею ни малейшего представления о моей ошибке. Спасибо за решение.Преобразование одномерного массива строк в двумерный массив строк в c

Debugger результат:

buffer char * "first\nsecond\nthird\nfourth\nfifth\nsixth\nseventh\n 
       eighth\nninth\ntenth\neleventh\ntwelfth\nthirteenth" 0x0000000100801200 
    *buffer char 'f' 'f' 
    countNewLine unsigned long 12 12 
    transfer char ** 0x100105520 0x0000000100105520 
    *transfer char * NULL 0x0000000000000000 
    rowTrack size_t 0 0 
    columnTrack size_t 0 0 
+1

'размерof (char *) * размерof (счетNewLine)' ..looks подозрительный. –

+1

Стандартное предупреждение: Пожалуйста, [не использовать] (http://stackoverflow.com/q/605845/2173917) возвращаемое значение 'malloc()' и family. –

+1

Цикл никогда не завершится с помощью 'buffer [rowTrack]! = '\ N' || buffer [rowTrack]! = '\ 0'; 'он должен использовать' && ', а также вы не выделили память для каждой строки' * transfer [] '. –

ответ

0

Есть несколько ошибок в коде. В этой строке

transfer = (char**)malloc(sizeof(char*)*sizeof(countNewLine)); 

второй sizeof() неверен, линия должна быть

transfer = malloc(sizeof(char*) * countNewLine); 

Далее, вы не выделять память для каждой строки, которая может быть что-то вроде этого

for (rowTrack = 0; rowTrack < countNewLine; rowTrack++) 
    transfer[rowTrack] = malloc(BUFSIZ); // or whatever the line length is 

Цикл for никогда не будет завершен с использованием ||

for (rowTrack = 0; buffer[rowTrack] != '\n' || buffer[rowTrack] != '\0'; rowTrack++) 

должен быть

for (rowTrack = 0; buffer[rowTrack] != '\n' && buffer[rowTrack] != '\0'; rowTrack++) 

И, наконец, я думаю, что у вас есть строка и столбец индексации изменилась в этом заявлении:

transfer[columnTrack][rowTrack] = buffer[rowTrack]; 

Существует более простой способ разделить вашу строку, как это : выход

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

#define BUFSIZ 512 

int main(void) { 

    char *buffer; 
    char *sptr; 
    char **transfer = NULL; 
    int rows = 0, row; 

    /* ... load the file contents */ 
    buffer = malloc(BUFSIZ); 
    strcpy (buffer, "first\nsecond\nthird\nfourth\nfifth\nsixth\nseventh\neighth\nninth\ntenth\neleventh\ntwelfth\nthirteenth"); 

    /* split the input */ 
    sptr = strtok(buffer, "\r\n"); 
    while (sptr) { 
     transfer = realloc(transfer, (rows+1) * sizeof(char*)); // expand string array 
     transfer[rows] = malloc(1+strlen(sptr)); // memory for string 
     strcpy (transfer[rows], sptr);    // copy the token 
     rows++; 
     sptr = strtok(NULL, "\r\n"); 
    } 

    /* show array */ 
    printf ("Showing %d rows\n", rows); 
    for (row=0; row<rows; row++) { 
     printf ("%s\n", transfer[row]); 
     free (transfer[row]);      // release mem 
    } 

    free (transfer);        // release mem 
    free (buffer);         // release mem 
    return 0; 
} 

Программа:

Showing 13 rows 
first 
second 
third 
fourth 
fifth 
sixth 
seventh 
eighth 
ninth 
tenth 
eleventh 
twelfth 
thirteenth 
+0

Запятая в состоянии не делает то, что (я думаю) вы ожидаете от этого: 'for (...; expr1, expr2; ...)' – pmg

+0

'buffer = malloc (BUFSIZ);' или 'transfer = malloc (BUFSIZ); '? – NewCoder

+0

@pmg Я ожидаю, что оба выражения будут истинными для цикла, чтобы продолжить, пожалуйста, исправьте меня, если я ошибаюсь. –

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