Могут ли строки sprintf / отформатированные быть переданы непосредственно в функцию? - PullRequest
2 голосов
/ 30 ноября 2010

Допускается ли что-то подобное в C ++? Если да, то как мне это сделать?

myFunction("User input: %s", a);

Или это единственный способ сначала отформатировать, а затем передать?

Ответы [ 5 ]

3 голосов
/ 30 ноября 2010

Полагаю, вам нужно вызвать такую ​​функцию, как vsprintf, из myFunction - таким образом вы можете выполнить форматирование внутри вашей функции. Пример:

void myFunction(const char *format, ...)
{
  char buf[1024];

  va_list arglist;
  va_start( arglist, format );
  vsprintf(buf,format,arglist);
  va_end( arglist );
}
3 голосов
/ 30 ноября 2010

Если вы хотите написать функцию, которая принимает переменные параметры, ответ - да, и вот как вы объявляете такую ​​функцию:

void myFunction(const char*, ...);

Обратите внимание на элипсис в конце.

Но теперь, когда вы знаете, как это сделать, я все усложню для вас. Вы не должны этого делать . myFunction(), объявленный выше, небезопасен по типу и полностью обходит все средства, которые C ++ должен защитить от ошибок.

Существуют и другие способы достижения чего-то подобного (vector приходит на ум), но я обнаружил, что если вам нужна функция, которая принимает переменные параметры, то это запах кода, который указывает, что что-то не так с Ваш дизайн в первую очередь. Посмотрите на почему вам это нужно.

EDIT:

Если то, что вы пытаетесь сделать, это не передавать переменные параметры как таковые, а отформатированную строку (как говорит ваш OP), тогда вам нужно будет выполнить форматирование строки самостоятельно в своей функции. Есть способы сделать это в зависимости от вашей платформы. В Windows вы, вероятно, использовали бы vsprintf() или что-то подобное.

Но опять же, если вам нужно сделать это, есть лучшие способы. Лично мне нравится использовать Boost формат .

1 голос
/ 30 ноября 2010

Законно делать то, что вы делаете, за исключением того, что

sprintf ведет к применению форматирования к строке.За пределами этой функции (и семейства printf в целом) ваши аргументы здесь на самом деле ничего не «значат», потому что сигнатура вашей функции может выглядеть так:

void myFunction(const char* str1, const char* str2);

Но что это такое делает зависит от вас.

Если вы хотите, чтобы строка была изменена перед передачей ее в какую-либо функцию, вам придется либо изменить ее вне myFunction (через sprintf или что-либо еще), либо передатьвсе ваши аргументы и вызовите sprintf внутри функции.

0 голосов
/ 30 ноября 2010

Можно использовать функцию vsprintf () из библиотеки C и записать myFunction() в качестве переменных аргумента.

Однако применяются обычные заявления об отказе в отношении методов переменного аргумента:таким образом очень легко ввести переполнения буфера или нарушения сегментации.Некоторые компиляторы позволяют вам объявить myFunction() как "printf-like", чтобы вы могли получить некоторую степень проверки аргументов во время компиляции, но это не переносимо.

0 голосов
/ 30 ноября 2010

Да, это разрешено. Нет, она не является частью стандартной библиотеки, поэтому вы должны реализовать ее самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...