Индексирование из списка строк в C?

#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 возвращает a char , но вы хотите , чтобы он возвращал строку, т. Е. Указатель на массив символов 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:

  1. Функция:
 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
}
 
  1. Не определяйте функции внутри других функций.

Переместите определение функции за пределы main функции.

  1. Ваша переменная должна ввести указатель на символ, так как строки в C являются массивами char s : char *this_month = get_month(i);
  2. Используйте правильный формат printf: printf ("Month %d is %sn", i, this_month);
  3. Используйте правильное main определение. Если он не принимает параметры, это должно было быть int main(void)
  4. Правильно отформатируйте свой код
 #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 =