Как мне распечатать содержимое массива строк? - PullRequest
0 голосов
/ 08 марта 2020

Я создал и инициализировал массив со следующими строками:

char print_names[][10] = {"\t\t1. John\n",
                          "\t\t2. Smith\n",
                          "\t\t3. Jane\n",
                          "\t\t4. Mary\n",
                          "\t\t5. Lisa\n"};

Насколько я знаю, имя массива является указателем. поэтому, когда я помещаю эти строки:

    printf("%c", *print_names[0]);
    printf("%c", *print_names[1]);

Он должен указывать на содержимое этого элемента массива. Но на консоли ничего не распечатывается.

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

РЕДАКТИРОВАТЬ: Я все еще изучаю основы c о массиве и указателе, поэтому я не включил <string.h> в файл.

Дополнительный вопрос: возможно ли напечатать содержимое (имена) без использования строки?

ОК. Я понял. Я думаю, что теперь понимаю. Спасибо за ответ.

Ответы [ 4 ]

2 голосов
/ 08 марта 2020

*print_names[0] равно print_names[0][0]. Это первый символ первой строки в print_names.

. И поскольку первый символ каждой строки в массиве print_names является вкладкой ('\t'), вы печатаете эту вкладку, которая на самом деле не является visible.

Если вы хотите напечатать саму строку, вам нужно использовать %s в качестве формата и передать указатель на первый символ. Что можно сделать следующим образом:

printf("%s", print_names[0]);

С другой стороны, если вы хотите напечатать вкладку и сделать ее видимой, затем окружите вывод другими символами. Например,

printf("tab = \"%c\"\n", print_names[0][0]);

, при котором вкладка будет напечатана в двойных кавычках.

0 голосов
/ 11 марта 2020

Это работает, но поскольку первый элемент каждой строки - \ t, вы не увидите ничего, что вы также можете использовать

printf("%s", print_names[0])

для печати: \ t \ t1 , Джон \ n
эта строка.

заметьте, что вы помещаете более 10 символов во второе измерение вашего массива.

0 голосов
/ 10 марта 2020

Поскольку вы увеличили размер массива (с 10 записями, но вы заполнили только 5, остальные заполнены указателями NULL), вы можете напечатать содержимое массива (одна строка на строку) с помощью:

char **p;
for (p = print_names; *p; p++)
    printf("%s", *p);

что эквивалентно этому коду:

int i;
for (i = 0; print_names[i]; i++)
    printf("%s", print_names[i]);

, если вы знаете, что в массиве 5 элементов:

int i;
for (i = 0; i < 5; i++)
    printf("%s", print_names[i]);
0 голосов
/ 08 марта 2020

Массив print_names имеет 2 измерения:

  • количество элементов определяется из инициализатора: 5 в вашем примере
  • количество char элементов в каждом элемент в массиве определен как 10.

Проблема в том, что 5 инициализаторов имеют ровно 10 символов, а один - 11 символов. Инициализатор несовместим с определением объекта, и ни один из элементов не является строкой с нулевым символом в конце.

Вы должны изменить ширину как минимум до 12, и вы можете использовать printf() для печати элементов массива следующим образом:

#include <stdio.h>

void print_array() {
    char print_names[][12] = {
        "\t\t1. John\n",
        "\t\t2. Smith\n",
        "\t\t3. Jane\n",
        "\t\t4. Mary\n",
        "\t\t5. Lisa\n"
    };
    size_t count = sizeof(print_names) / sizeof(print_names[0]);
    for (size_t i = 0; i < count; i++) {
        printf("%s", print_names[i]);
    }
}

Относительно вашего подхода:

Насколько я знаю, имя массива - это сам указатель.

Не совсем: имя массива просто так. Когда вы используете имя массива в выражении, отличном от sizeof(n), оно распадается в указатель на первый элемент массива.

В строках ниже выводится первый байт первая и вторая строки:

printf("%c", *print_names[0]);  // same as print_names[0][0]
printf("%c", *print_names[1]);  // same as print_names[1][0]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...