Я прочитал сообщение sprintf format specifier replace by nothing, и другие связанные, но не видели это специально.Помогает ли sprintf() задавать спецификаторы спецификаций?
До сегодняшнего дня я никогда не видел sprintf
, используя только 2 аргумента.
Прототип моя система использует для sprintf()
является:
int sprintf (char Target_String[], const char Format_String[], ...);
При работе с некоторыми унаследованного кода, я натыкался на это: (упрощен для иллюстрации)
char toStr[30];
char fromStr[]={"this is the in string"};
sprintf(toStr, fromStr);
Моя интерпретация прототипа является то, что второй аргумент должен состоять из const char[]
и принимать стандартные спецификаторы формата ansi C such as these.
Но приведенный выше пример, похоже, работает отлично с строкой fromStr
в качестве второго аргумента.
Является ли это чисто неопределенным поведением, что это работает ?, или это использование совершенно законно?
Я работаю над Windows 7, используя компилятор C99.
По другой причине, я бы сказал, что код находится рядом с ошибкой - я бы ожидать 'голец fromStr [] = {"this in the string"}; 'должно быть' char fromStr [] = "это строка в строке"; '(no' {} '). Код компилируется, так как я уверен, что OP намеревается, но для меня это выглядит как 'char fromStr [] = {" this in the string "};' должен сделать массив из 1 'char' со значением указателя, преобразованного в 'char'. Я думаю, это правильно, но выглядит неправильно – chux
@chux - Интересно. Я смотрел по-одному, пытаясь выяснить, какие режимы отказа, если таковые имеются, я мог бы найти. (вид связанный с _format string attack_, упомянутый в комментариях ниже). Я пробовал с '= {"% это строка в строке "};' которая была ошибочной с _unknown specifier_, затем снова с '= {"% cthis является строкой "};', которая потому, что% c является известным спецификатором , с ошибкой _ Недостаточно параметров_. оба из которых, похоже, подтверждают правду ответов ниже. Что касается использования скобок '{" ... "};', они не создают проблемы для меня. – ryyker