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

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

#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, и хотя она не выдает никаких ошибок, программа вылетает при каждом запуске.Код, кажется, хорошо из примеров, которые я видел.Было бы здорово узнать, делаю ли я что-то не так.

Спасибо.

Ответы [ 5 ]

16 голосов
/ 20 ноября 2010

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

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

7 голосов
/ 20 ноября 2010

У вас неверный спецификатор формата.%s используется для строк, но вы передаете size_t (strlen(string)).Использование неверного спецификатора формата в printf() вызывает неопределенное поведение .Вместо этого используйте %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

2 голосов
/ 20 ноября 2010

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

поместить

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

2 голосов
/ 20 ноября 2010
 printf("That string is %d characters long.\r\n", strlen(string));

вместо

 printf("That string is %s characters long.\r\n", strlen(string));
1 голос
/ 21 ноября 2010

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

...