Приращение указателя на строковый массив возвращает NULL - PullRequest
0 голосов
/ 11 февраля 2019

Я пытаюсь передать массив строк в функцию для вывода на экран.Первая строка печатается нормально.Последующие строки, однако, являются нулевыми и, следовательно, ничего не печатают.Если я получу указатель непосредственно на первую строку вместо массива, я могу увеличить его на размер массива символов, и все будет напечатано правильно.Если я пытаюсь увеличить указатель на массив строк, где я получаю ноль.Почему это происходит и как я могу правильно распечатать массив.Также я использую Visual Studio, если это вообще на него влияет, учитывая используемый стандарт C.

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

//How I'm passing the array
char headings[4][20] = { "Name", "Record Number", "Quantity", "Cost"};
int widths[4] = {20, 20, 20, 20 };
headers(&headings[0][0], &widths[0], 4);


//Function
void headers(char **heads, int *columnWidths, int noOfColumns) {
    int headLength = 0;
    printf("|");
    for (int i = 0; i < noOfColumns; i++) {
        headLength += printf("%*s|", *columnWidths, heads);
        columnWidths++;
        heads ++;
    }
    printf("\n");
    for (int i = 0; i < headLength+1; i++) {
        printf("-");
    }
    printf("\n");
}

Это вывод, который я получаю:

|                Name|                    |                    |                       |

, но я ожидаю этот вывод:

|                Name|       Record Number|            Quantity|                   Cost|

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Если у вас есть 2D Array heading, ваша функция headers также должна принимать 2D массив.Хотя массивы обычно переходят в указатели при передаче в функции, тип char** heads отличается от char headings[4][20].И ваш компилятор должен предупредить вас об этом.

Следующий бит кода выводит правильный вывод.

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

//Function
void headers(char heads[4][20], int *columnWidths, int noOfColumns) {
    int headLength = 0;
    printf("|");
    for (int i = 0; i < noOfColumns; i++) {
        headLength += printf("%*s|", *columnWidths, *heads);
        columnWidths++;
        heads ++;
    }
    printf("\n");
    for (int i = 0; i < headLength+1; i++) {
        printf("-");
    }
    printf("\n");
}

int main(){
    char headings[4][20] = { "Name", "Record Number", "Quantity", "Cost"};
    int widths[4] = {20, 20, 20, 20};
    headers(headings, &widths[0], 4);
}

Примечание: вы также можете изменить функцию headers, чтобы она принимала char heads[][20], но не char[][], как это было бывыдает очевидную ошибку компилятора.

0 голосов
/ 11 февраля 2019

Вам нужно будет передать headings в вашу функцию, а не адрес первого символа первой функции.Но в C многомерные массивы представляют собой совершенно разные типы, и структура памяти значительно отличается от array of char *.

Это рабочий вариант, который поддерживает произвольные измерения, в отличие от принятого решения, которое поддерживает только 4 строки массива с 20 символами:

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

//Function
void headers(const char **heads, int *columnWidths) {
    int headLength = 0;
    printf("|");
    while (*heads) {
        headLength += printf("%*s|", *columnWidths, *heads);
        columnWidths++;
        heads ++;
    }
    printf("\n");
    for (int i = 0; i < headLength+1; i++) {
        printf("-");
    }
    printf("\n");
}

int main(){
    const char *headings[] = { "Name", "Record Number", "Quantity", "Cost", 0};
    int widths[4] = {20, 20, 20, 20};
    headers(headings, &widths[0]);
}

Не знаюЯ думаю, что ошибка связана с вызовом, потому что переданный указатель указывает на адрес массива строк.

Нет.Указатель на массив строк называется headings.Это массив char с двумя измерениями.Невозможно перебрать отдельные строки без знания структуры массива.

Вместо этого обычно лучше определить array of char * и инициализировать его с отдельными строками.Вы можете видеть, как определение содержимого массива выглядит точно так же, как и в варианте многомерного массива, но структура памяти сильно отличается, и теперь можно выполнять итерации по строкам, как вы изначально предполагали.

...