2015-12-19 4 views
0

Screenshot of the programпрограммирования C Printf из массива

В этой программе пользователь вводит дату и месяц года с точки зрения числа. Выход должен быть в буквах. Я не могу изменить переменные.

  1. Я не знаю, как печатать месяцы в массиве. Я пробовал% s, , думая, что это строка, но она не работает.
  2. Элемент списка Я не понимаю, почему мы должны использовать указатель, если memnames уже является массивом? Я думал, что они такие же или эквивалентны? Заранее благодарим за помощь! :)
+5

Пожалуйста, не публикуйте снимки экрана кода. Отправьте код в виде текста в вопрос (чтобы другие могли легко скопировать его и избежать проблем с внешней зависимостью сайта). – kaylum

+0

Также некоторые из нас получают доступ к сайту с помощью мобильных устройств. –

+1

Измените 'printf' на'% s' на 'monthnames [month-1]'. – kaylum

ответ

4

Для печати названия месяца просто использовать

printf("%s", monthnames[month]); 

вместо

printf("%c", *monthnames[month]); 

Последний раз печатает первый символ в какой-то месяц.

monthnames - это массив указателей на char. Таким образом, вы можете использовать каждый элемент в этом массиве, чтобы указать на строку C - как это имеет место в вашем коде.

Примечание: остерегайтесь указателей, в комментариях кода вы предлагаете апрель - 4-й месяц. Тогда декабрь будет 12-м, но ваш массив может иметь только максимальный индекс 11.

+1

Может потребоваться «месяц-1». Поскольку комментарии в коде предполагают, что ввод месяца начинается с '1'. Предложите уточнить с помощью ОП или просто указать на это. – kaylum

+0

@kaylum: Хорошо. Hope OP может решить эту проблему по своему усмотрению. –

+1

Возможно, было бы неплохо сделать некоторые проверки ввода пользователя перед использованием 'month' для индексации массива. Если пользователь вводит большой месяц, например, месяц nr 20 или отрицательный месяц, например месяц -5, в противном случае вы получите segfault. –

1

Ваши переменные monthnames - это массив указателей на строки с нулевым символом. Это означает, что monthnames[month] является указателем на строку с нулевым завершением, которую вы можете напечатать f с% s и *monthnames[month] - это первый символ в этой строке, который вы можете печатать с помощью% c. *pointer означает переменную, на которую указывает pointer.

Возможно, было бы неплохо проверить ввод пользователя перед использованием month для индексации массива. Если пользователь вводит большой месяц, например, 20 или отрицательный месяц, ваша программа, вероятно, будет отключена без такой проверки.

1

Получите строку из такого массива, используя monthnames[month].

Вы видите, monthnames - это массив (но мы обозначаем его как указатель) массивов char s. Поскольку мы рассматриваем указатель как массив здесь, нам не нужно его разыскивать.

Возможно, вы также захотите объявить свои вещи const, если вы не собираетесь их менять. Это не требуется, но это хорошая практика.

Я сделал программу, чтобы проверить это в случае, если вы не верите мне:

#include <stdio.h> 

int main(void) 
{ 
    const char* monthnames[2] = { "Jan", "Feb" }; 

    printf("%s\n", monthnames[0]); 
    printf("%s\n", monthnames[1]); 

    return 0; 
} 

Выходные:

Jan 
Feb 
Смежные вопросы