C - формат указывает тип 'int', но аргумент имеет тип 'char *' [-Wformat] - PullRequest
0 голосов
/ 20 апреля 2020

Я определил vector указателей с рабочими днями. Позже я хочу отсортировать дни lexicographically.

Я печатаю все будни, используя printf("%s", *(wochentag + i));, что работает. Я хочу вывод каждой первой буквы каждого дня недели. Позже я также хочу получить доступ ко второй, третьей, ... букве каждого слова.

Используя

printf("%c", *(wochentag + i));` 

, я получаю следующее предупреждение:

format specifies type 'int' but the argument has type 'char *' [-Wformat].

Вот мой код:

int main()
{
   static char *wochentag[] = {"Montag", "Dienstag", "Mittwoch", "Donnerstag", 
                        "Freitag", "Samstag", "Sonntag"};
    printf("%lu\n", sizeof(wochentag));
    printf("%lu\n", sizeof(char));
    for (int i = 0; i < 7; i++)
    {
        printf("%s\n", *(wochentag + i));
    }
    for (int i = 0; i < 7; i++)
    {
        printf("%c\n", *(wochentag + i));
    }
}

Что я делаю не так ?

Ответы [ 3 ]

2 голосов
/ 20 апреля 2020

Сообщение об ошибке самоочевидно, имеется несоответствие типов данных.

Другой синтаксис записи *(wochentag + i) - (wochentag[i]), тип char *.

Теперь передавать это значение в %c неверно, поскольку эта спецификация преобразования ожидает тип char.

Если вас интересует только первый символ, вы должны проиндексировать этот массив, например (wochentag[i][0]). Что-то вроде

 printf("%c\n", wochentag[i][0]);

должно работать.

1 голос
/ 20 апреля 2020

В printf("%c\n", *(wochentag + i)), *(wochentag + i) - строка, точнее разыменованный указатель на строковый литерал (байтовый массив только для чтения с нулевым символом в конце), как вы можете видеть в своем коде, вам нужен спецификатор формата "%s" .

Чтобы напечатать первые char в каждой строке, вам понадобится дополнительная разыменование:

printf("%c\n", **(wochentag + i));

Или для более удобной для чтения нотации

printf("%c\n", wochentag[i][0]);

Предупреждение, указывающее, что "%c" ожидает int, связано с тем, что он действительно ожидает код int для указанного символа c.

Практический пример:

int x = 65;  //ASCII code for the letter 'A'
printf("%c\n", x);

Это выведет A.

0 голосов
/ 20 апреля 2020

Ваш тип данных массива char * [] является типом двойного указателя, поэтому, когда вы печатаете с использованием% s, он знает, что у него есть адрес некоторого массива символов, но когда вы печатаете, используя только "% c" в printf Вы должны указать действительный символ, но не адрес .... поэтому вы должны дважды отменить ссылку на него

Как показано ниже

printf("%c", **(wochentag + i));

Надеюсь, это решит вашу проблему .... мир

...