Ответ 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)