#arrays #c #char #c-strings #function-definition
Вопрос:
Очевидный вопрос новичка, я пытаюсь написать что-то, что вы вставляете в int, и это дает вам месяц. Вот версия функции на python:
months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
def get_month(mon):
return months[mon]
В C я сделал это:
#include <stdio.h>
char *months[12] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
int main()
{
char get_month(int m)
{
return *months[m];
}
for (int i = 0; i < 12; i )
{
char this_month = get_month(i);
printf ("Month %d is %cn", i, this_month);
}
return 0;
}
Я получаю этот вывод
Month 1 is J
Month 2 is F
Month 3 is M
Month 4 is A
Month 5 is M
Month 6 is J
Month 7 is J
Month 8 is A
Month 9 is S
Month 10 is O
Month 11 is N
Month 12 is D
Я думаю, что я должен каким-то образом учитывать длину строк (или они технически являются символами?) в *месяцах[12], Но я не знаю, как это сделать. Если я изменю его на *месяцев[12][3], я получу
warning: returning ‘char *’ from a function with return type ‘char’ makes integer from pointer without a cast [-Wint-conversion]
Кроме того, что, если бы они не были одинаковой длины (т. Е. Месяцы были выписаны полностью)?
Комментарии:
1. Так ты хочешь вместо этого получить целый месяц?
2. Подумайте об этом:
get_month
возвращает achar
, но вы хотите , чтобы он возвращал строку, т. Е. Указатель на массив символовchar *
, тогда решение должно быть очевидным.
Ответ №1:
Определение функции внутри другой функции не является стандартной функцией языка Си.
Вам нужно переместить определение функции get_month
выше основного.
Элементы массива monhts
имеют тип char *
.
char *months[12] = { /*... */ };
Таким образом, функция get_month
, возвращающая элемент массива, должна иметь тот же тип возвращаемого значения, что и тип элементов массива.
char * get_month(int m)
{
return months[m];
}
Поэтому в цикле for в main вам нужно написать
char *this_month = get_month(i);
printf ("Month %d is %sn", i, this_month);
Что касается этого выражения *months[m]
, то оно дает первый символ строки, на которую указывает указатель months[m]
, потому что у вас есть массив указателей.
Ответ №2:
- Функция:
char get_month(int m) // this declares function which returns a single char
{
return *months[m]; // months is array of pointers. months[m] gives pointer to string. *months[m] dereferences that pointer giving the first character of the month name.
}
это должно быть:
char *get_month(int m) // this declares function which returns pointer to the char array.
{
return months[m]; // months is array of pointers. months[m] gives pointer to the char array containing the month name
}
- Не определяйте функции внутри других функций.
Переместите определение функции за пределы main
функции.
- Ваша переменная должна ввести указатель на символ, так как строки в C являются массивами
char
s :char *this_month = get_month(i);
- Используйте правильный формат printf:
printf ("Month %d is %sn", i, this_month);
- Используйте правильное
main
определение. Если он не принимает параметры, это должно было бытьint main(void)
- Правильно отформатируйте свой код
#include <stdio.h>
char *months[12] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
char *get_month(int m)
{
return months[m];
}
int main()
{
for (int i = 0; i < 12; i )
{
char *this_month = get_month(i);
printf ("Month %d is %sn", i, this_month);
}
return 0;
}
Ответ №3:
в вашем методе тип возвращаемого значения-char вместо char*, поэтому вы можете возвращать только один символ вместо строки.
char get_month(int m)
{
return *months[m];
}
Следующая проблема заключается в том, что вы разыменовываете значение, которое просматривается из массива
, поэтому вместо указателя на строку вы получаете значение в начальном адресе этой строки, которое является первой буквой.
Попробуйте это вместо этого:
char* get_month(int m)
{
return months[m];
}
Комментарии:
1. Также спецификатор
printf
формата.%c
->%s
.2. И.
char this_month =