Почему использование неправильного спецификатора формата в 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()
, где нет ничего похожего на строку и, вероятно, нет никакой доступной памяти вообще.