Warning: формат не строковый литерал и аргументы формата

Я хочу удалить предупреждение, которое я получаю в этой строке кода,

FILE *fil;
char *imp;
(...)
fprintf(fil,imp);

вещь, когда я делаю это, она записывает в файл именно то, что я хочу, но если я применяю формат% s, это не так, как этот

fprintf(fil, "%s", imp);

Ответы

Ответ 1

Это предупреждение - это gcc-способ сообщить вам, что он не может проверить аргумент строки формата для функции стиля printf (printf, fprintf... и т.д.). Это предупреждение генерируется, когда компилятор не может вручную заглянуть в строку и убедиться, что все будет идти так, как вы планируете во время выполнения. Давайте рассмотрим несколько примеров.

Случай 1. Эта строка может быть проверена во время компиляции, и компилятор разрешит ее без предупреждения:

printf("This string has no format");

Случай 2: для этого случая компилятор может обнаружить, что у вас есть спецификатор формата, и будет вызывать другое предупреждение. На моей машине он сказал "предупреждение: слишком мало аргументов для формата".

// This will most probably crash your machine
printf("Not a safe string to %s"); 

Случай 3. Теперь это ваш случай. Вы берете строку, сгенерированную во время выполнения, и пытаетесь ее распечатать. Предупреждение, которое вы получаете, это компилятор, предупреждающий вас о том, что в строке может быть спецификатор формата. Скажем, например, "bad% sdata". В этом случае среда выполнения попытается получить доступ к несуществующему аргументу для соответствия% s. Хуже того, это может быть пользователь, пытающийся использовать вашу программу (заставляя ее читать данные, которые небезопасно читать).

char str[200];
scanf("%s", str)
printf(str)

Ответ 2

В то время как технически нет ничего плохого в вызове функции, подобной printf, со строкой, это по-прежнему плохой практикой, потому что строка может содержать маркеры формата, такие как %s. Если imp - %s test, например, произойдут плохие вещи.

Если вы просто хотите напечатать imp без форматирования, вы должны использовать fputs(imp, fil) (обратите внимание на обратные аргументы).