2012-04-24 4 views
-1

У меня есть что-то вроде этогоФормат спецификаторы в C -% S внутри% s

char string[]="My name is %s"; 

printf("%s",string,"Tom"); 

я ожидаю выход быть My name is Tom, но я получаю My name is %s

Я пытался уйти от % характер, но работа.

Что здесь не так? Как мне получить %s внутри %s?

+2

Printf только интерпретирует% в это первый аргумент, строка формата. – nos

ответ

7

Try что-то вроде этого

printf(string,"Tom"); 

Проблемы с вашим методом заключается в следующем -

Как только printf видит формат %s спецификатор в строке формата, он предполагает, что следующий аргумент в списке является строка, на которую указывает указатель на символ, извлекает ее и печатает ее вместо %s. Теперь printf не делает рекурсивной заменой и, следовательно, %s внутри вашего string остается таким, каким он есть, и «Том» теперь является дополнительным аргументом, который просто отбрасывается.

1

printf(string, "Tom") возможно?

1

Первый параметр для printf - это строка формата. Остальные - все параметры, которые будут отформатированы в соответствии со строкой формата. Строки формата нигде не гнездятся. Другими словами, даже если строка, которая должна быть отформатирована, содержит инструкцию форматирования, она просто печатается и не интерпретируется как другая строка форматирования.

Если вы хотите иметь такого рода форматирование окольного, вы должны сначала создать новую строку формата (sprintf полезно для этого):

char string[] = "My name is %s"; 
char format[100]; 

sprintf(format, "%s", string); 

, а затем использовать вновь генерируется строка формата:

printf(format, "Tom"); 
1

проблема с printf("%s",string,"Tom"); линии Вы должны использовать

char string[]="My name is %s"; 
printf(string,"Tom"); 

здесь вы получите выход в

My name is Tom 
3

Существует только один расширение в течение printf; это означает, что любые строки передаются в printf, за исключением того, что строки формата будут напечатаны дословно (если вообще). На самом деле это хорошо, потому что в противном случае он оставляет огромную дыру в безопасности.

Риск безопасности относится к тому, что строка формата и список параметров должны соответствовать. Это означает, что, если нежелательный % делает его в строку формата, вы получите в беде:

char ch[50]; 
fgets(ch, 50, stdin); 
printf(ch); 

Если поставки пользовательских например.%p %p %p %p, он будет считывать данные, хранящиеся в стеке (например, обратный адрес и т. Д.), Если он поставляет %s %s %s, он, скорее всего, нарушит работу программы. Если он поставляет %n, он перезапишет некоторые данные в стеке.

Тем не менее, вы можете просто вычислить строку формата, если вы хотите:

char ch[50]; 
char format_prototype[]="My name is %s"; 
snprintf(ch, 49, "%s", format_prototype); 
ch[49]=0; 
printf(ch, "Tom"); 
+0

+1 для обсуждения аспектов безопасности –

Смежные вопросы