Как передать двумерный массив символов в функцию? - PullRequest
0 голосов
/ 04 мая 2020

Итак, я пытаюсь передать

char parent[n][50];

в функцию initialize ();
А затем скопируйте символ x в родительский элемент [i] внутри initialize (); функция. Пример

x = "Cityname"
and when passed into the initialize();
it would do
strcpy(parent[i], x);
to make the
parent[i] = "Cityname"
void initialize(char *parent, int *ranks, char x, int i){

    strcpy(parent[i], x);
    ranks[i] = '0';

}

int main(){

    int n, i = 1;
    char x[20];

    printf("Enter how many city are there : "); scanf("%d", &n); fflush(stdin);

    char parent[n][20];
    int ranks[n];

    while(1){
        printf("enter city name: "); scanf("%[^\n]", x);
        if(i <= n){
            initialize(parent[][20], ranks, x, i);
            i++;
        } else {
            printf("The city is at maximum\n");
        }
    }
}

Выдает предупреждение:

passing argument 1 of 'strcpy' makes pointer from integer without a cast 
note: expected 'char *' but argument is of type 'char' 
and also in function main 
error: expected expression before ']' token

Может кто-нибудь объяснить, как правильно использовать strcpy (parent [i], x)? Я не могу понять эту проблему.

1 Ответ

2 голосов
/ 04 мая 2020

Я вижу несколько проблем с вашим кодом. Массивы и указатели в C могут сбивать с толку, поэтому следует помнить о нескольких правилах:

char x [n] может автоматически преобразовываться компилятором C в char * x.

char x [10] [20] представлен под капотом как одномерный массив, а компилятор вычисляет смещения за кулисами. Например, если x был массивом 10 x 20, выражение x [1] [2] могло бы быть скомпилировано как *(x + 22). По этой причине это может привести к неожиданным результатам приведения двумерного массива к символу *, и недопустимо приведение двумерного массива к символу **.

С учетом этих правил вот как изменит ваш код

void initialize(char (*parent)[20], int *ranks, char *x, int i){

    strcpy(parent[i], x);
    ranks[i] = '0'; // Did you want an automatic conversion from char to int here? Maybe you meant ranks[i] = 0?

}

int main(){

    int n, i = 0; // As Craig mentions, i should start at 0.
    char x[20];

    printf("Enter how many city are there : "); scanf("%d", &n); fflush(stdin);

    char parent[n][20];
    int ranks[n];

    while(1){
        printf("enter city name: "); scanf("%19s", x); // scanf will automatically stop at whitespace, and you must include the max length to avoid a buffer overrun.
        if(i < n){
            initialize(parent, ranks, x, i);
            i++;
        } else {
            printf("The city is at maximum\n");
            // Maybe break here, unless you want an infinite loop
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...