Почему использование неправильного спецификатора формата в C приводит к сбою моей программы в Windows 7?

Моя программа выглядит следующим образом:

#include <stdio.h>
#include <string.h>

int main()
{
        char string[] = "Gentlemen start your engines!";
        printf("That string is %s characters long.\r\n", strlen(string));
        return 0;
}

Я компилирую под gcc, и хотя он не дает мне никаких ошибок, программа вылетает каждый раз при запуске. Код, кажется, прекрасен из примеров, которые я видел. Было бы здорово узнать, не делаю ли я что-то неправильно.

Спасибо.

Ответы

Ответ 1

Использование неправильного спецификатора формата в printf() вызывает Undefined Поведение. Правильный спецификатор формата должен быть %zu (not %d), поскольку возвращаемый тип strlen() равен size_t

Примечание: модификатор длины z в %zu представляет целое число, такое же, как size_t

Ответ 2

У вас неправильный спецификатор формата. %s используется для строк, но вы проходите size_t (strlen(string)). Использование неправильного спецификатора формата в printf() вызывает поведение undefined. Используйте %zu вместо этого, потому что возвращаемый тип strlen() равен size_t.

Итак, измените

 printf("That string is %s characters long.\r\n", strlen(string));

в

 printf("That string is %zu characters long.\r\n", strlen(string));

Поскольку вы используете gcc, посмотрите здесь для получения дополнительной информации о том, что можно передать в printf

Ответ 3

 printf("That string is %d characters long.\r\n", strlen(string));

вместо:

 printf("That string is %s characters long.\r\n", strlen(string));

Ответ 4

У вас есть проблема здесь printf("That string is %s characters long.\r\n", strlen(string));

ставить

printf("That string is %d characters long.\r\n", strlen(string)); % d, потому что вы хотите напечатать длину str (число возвратов strlen)

Ответ 5

Программа вылетает из-за того, что процедура форматирования пытается получить доступ к строке по адресу 0x0000001D, который является результатом strlen(), где нет ничего похожего на строку и, вероятно, нет никакой доступной памяти вообще.