Находить слова с последовательными гласными? - PullRequest
0 голосов
/ 03 мая 2020

Код не работает: он не дал никаких результатов, я пытался решить его без использования функций, и это работало нормально, но когда я использовал функции, это не работало.

Я думаю проблема заключается в передаче 2d массива в функцию. Можете ли вы помочь мне понять, в чем проблема?

#include<stdio.h>
#include<string.h>
int cons_vols(char* str, char vol_words[][]);
int is_vol(char);

int main()
{
    /*
    Enter a string to find words with consecutive vowels
    Please Enter password for Authentication
    Words with Consecutive Vowels
    Please
    Authentication
    */
    char str[100] = {0};
    char vol_words[100][100] = {0};
    int totl_vols;
    printf("Enter a string\n");
    fgets(str, 100, stdin);
    totl_vols = cons_vols(str, vol_words);
    for(int i=0;i<totl_vols;i++){
        fputs(vol_words[i], stdout);
        printf("\n");
    }
    return 0;
}

int cons_vols(char* str, char vol_words[][]) {
    int vols = 0;
    int i = 0;
    //    please enter
    // j =0123456789A
    for(int j= 0; j<strlen(str)-2; j++) {
        if(str[j] == ' ' || str[j] == '\n') {
            i = j+1;
        }
        else {
            if( is_vol(str[j]) && is_vol(str[j+1])) {
                while(str[j] != ' ' && str[j] != '\n' && str[j] != '\0') {
                    j++;
                }
                for(int k=0; k<j-i; k++) {
                     vol_words[vols][k]= str[k+i];
                }
                vols++;
                i = j+1;
            }
        }
    }
    return vols;
}

int is_vol(char ch) {
    if(ch == 'A' || ch == 'E' || ch == 'I' || ch == 'O' || ch == 'U'
    || ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u' )
        return 1;
    return 0;
}

Ответы [ 2 ]

1 голос
/ 03 мая 2020

При передаче массивов в C имя массива превращается в указатель на первый элемент. При этом он теряет объем памяти, выделенный для массива.

Таким образом, указатель фактически не знает, где заканчивается массив, и может в конечном итоге получить доступ / поменять неопределенные области памяти. Чтобы предотвратить это, дополнительный параметр размера массива обычно передается в функцию. В вашем случае для двумерного массива компилятор имеет доступ только к первому массиву внутри двумерного массива. Таким образом, чтобы компилятор знал фактические границы массива, в столбец включено количество столбцов в массиве.

Вы можете проверить эту ветку для подробного ответа.

1 голос
/ 03 мая 2020

Массив

char vol_words[100][100] = {0};

- это 100-элементный массив "100-элементного массива char".

В C массивы в аргументах функции интерпретируются как указатель на его тип элемента.

В этом случае вы используете массив "100-элементный массив символов", поэтому вам следует указать, что вы используете его.

В заключение, что вам следует нужно изменить char vol_words[][] (как в объявлении, так и в определении) на char vol_words[][100].

...