2015-01-21 2 views
0

Я пытаюсь создать функцию, которая получает строку, переданную как «Hello». возвращаемое значение функции должен быть массив строк, которые будут выглядетьдвухмерный массив строк

H 
He 
Hel 
Hell 
Hello 

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

char stutterString(char string[]) 
{ 
    rowLength = strlen(string); 
    char help_string[][rowLength]; // I wanted to make the onedimensiol string i get into a two dimensial one so I can then compare my strings in a forloop 

    strcpy(help_strig, string); // I'm not sure if that's how you copy a 1d string into a 2d string, I guess not. 

Мои петли выглядят как

for(; count1 <= COLUMN; count1++) 
    { 
    for(count2 = 0; count2 <= NumberRow; count2++) 
    { 
     new_string[count1][ROW] = help_string[0][count2]; 

     ROW++ 
    } 
    NumberRow++; 
    } 

// NumberRow indicates the limit on the letters that should be copied. like in the beginning it's 1 for H, then 2 for the He and so on.. 
//count1 is for the column number we r currently and count2 for the row 

Любые идеи, как я могу добиться того, что легче/где улучшить мой код?

+0

'char help_string [] [rowLength];' является незаконным, как 'strcpy (help_strig, string);'. Также невозможно вернуть массив строк в C. Я бы предложил прочитать некоторые уроки или книги о массивах, прежде чем продолжить –

+0

Спасибо за предложение, да, мне все равно придется читать A LOT. –

ответ

1

Вам необходимо объявить двумерный массив, например.

char array[50][200]; 

Затем скопировать 1D строку в массив вы могли бы сделать это

strcpy(array[0], "Hello"); 

Чтобы скопировать часть строки из 2D массива в другой массив 2D, используйте функцию strncpy, например,

length = 3; 
strncpy(new_string[index], help_string[10], length); 
new_string[index][length] = '\0'; 

Это будет копировать первые 3 символа help_string[10] в new_string массив. Обратите внимание, что strncpy не может завершать строку символом NUL (в зависимости от длины исходной строки), поэтому это необходимо сделать после копирования.

+2

Будьте осторожны с 'strncpy()'; он не всегда имеет нуль-конец строки, в которую он копирует. Если массив уже обнулен, это не имеет значения. Если он использовался для чего-то еще перед рукой, это имеет значение. –

+0

@JonathanLeffler Хорошая точка, спасибо. – user3386109

0

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

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

char ** 
stutterString(char *str) 
{ 
    int i, sz, len=strlen(str); 
    char **rtn; /* a 2-dimensional array */ 
    char *s; 

    /* allocate the number of rows plus an extra one to indicate the end of list. 
    calloc() will set all "rows" to NULL. 
    */ 
    rtn = (char **)calloc(len+1, sizeof(char **)); 
    for(i=0; i<len; ++i) { 
    /* allocate the string - 
     '2' is 0 offset plus i plus 1 for \0 
    */ 
    s = (char *)malloc(sizeof(char *) * (i+2)); 
    memcpy(s, str, i+1); 
    s[i+1] = '\0'; 
    rtn[i] = s; 
    } 

    return(rtn); 
} 

int 
main() 
{ 
    int i; 
    char **stutter; /* think of it as a 2-dimensional array */ 

    stutter = stutterString("hello"); 

    /* Print and free the string. It's important to free when 
    you are done with the memory! */ 
    for(i=0; stutter[i]!=NULL; ++i) { 
    puts(stutter[i]); 
    free(stutter[i]); 
    } 
    free(stutter); /* free the array itself */ 

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