Печать
Категория: Главная
Просмотров: 500

В функции printf () первый аргумент является строкой формата. Он может содержать различные проценты-заполнители для представления значений, выраженных в оставшихся аргументах. Но может ли один из этих аргументов содержать заполнители?

Ответ «Нет». Только первый аргумент сканируется для процентных заполнителей. Так что следующий трюк не работает:

#include <stdio.h> 

int main () 
{ 
    printf ("Меня зовут% s \ n", "Dan% s", "Gookin"); 

    Возвращение (0); 
}

Я предполагаю, что логика здесь в том, что второй аргумент "Dan %s"каким-то образом комбинируется со строкой формата, чтобы разрешить доступ к третьему аргументу. Однако, когда вы компилируете код, вы получаете предупреждение о избыточном аргументе в выражении printf () . Вывод выглядит так:

My name is Dan %s

Поскольку первый аргумент оператора printf () может быть переменной, можно создать строку формата на лету, чтобы включить столько аргументов, сколько вы пожелаете. Такой маневр сложен, и вы должны быть осторожны, чтобы убедиться, что количество заполнителей соответствует количеству аргументов, чтобы программа не потерпела неудачу.

Чтобы это работало, используйте функцию построения строк sprintf () . Создайте строку так, чтобы она содержала правильное количество заполнителей, как это сделано в следующем коде:

#include <stdio.h> 

int main () 
{ 
    char format0 [32]; 
    char format1 [] = "Меня зовут% s"; 
    char format2 [] = "% s \ n"; 

    Sprintf (format0, "% S% S", формат 1 , ФОРМАТ2); 
    Е (format0, "Дан", "Gookin"); 

    Возвращение (0); 
}

Три буфера символов используется в этом коде: format0[]format1[]и format2[]. Первая - это хранилище, а вторая - строки форматирования.

В строке 9 используется функция sprintf () для конкатенации format1[]и format[2]помещения результата в format0[]буфер. В результате получается строка форматирования с двумя %sзаполнителями. Они приходят из отдельных строк. ( "%s%s"Строка форматирования в функции sprintf () - это то, что объединяет две строки.) Вот результирующая строка формата:

"My name is %s %s\n"

Эта строка используется в операторе printf () в строке 10, которая затем поглощает аргументы "Dan"и "Gookin"создает выходные данные:

My name is Dan Gookin

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