2009-11-20 4 views
5

Обычно вы можете напечатать строку в C, как это ..Форматирование строки в C

printf("No record with name %s found\n", inputString); 

Но я хотел бы сделать строку из него, как я могу это сделать? Я ищу что-то вроде этого ..

char *str = ("No record with name %s found\n", inputString); 

Я надеюсь, что это ясно, что я ищу ...

+3

Сделайте себе одолжение и пойти купить «Язык программирования C» по Kernigham & Ritchie. – Pete

+1

Спасибо, Пит, я буду. – itsaboutcode

+0

http://www.eskimo.com/~scs/cclass/cclass.html –

ответ

31

Одним из вариантов было бы использовать sprintf, который работает так же, как printf, но принимает в качестве своего первый параметр - указатель на буфер, в который он должен поместить результирующую строку.

Предпочтительно использовать snprintf, который принимает дополнительный параметр, содержащий длину буфера для предотвращения переполнения буфера. Например:

char buffer[1024]; 
snprintf(buffer, 1024, "No record with name %s found\n", inputString); 
3

Посмотрите на sprintf (см. Ниже).

int n = sprintf(str, "No record with name %s found\n", inputString); 
3

Использование

sprintf(str, "No record with name %s found\n", inputString); 
10

Вы ищете sprintf семейства функций. Их общий формат:

char output[80]; 
sprintf(output, "No record with name %s found\n", inputString); 

Однако sprintf само по себе является чрезвычайно опасно. Он подвержен тому, что называется переполнением буфера. Что это означает, что sprintf не имеет представления о том, насколько велика строка output, которую вы предоставляете, так что она будет охотно писать больше данных, чем доступно. Например, это будет компилировать чисто, но перезаписать действительную память — и нет никакого способа, чтобы sprintf знать, что он ничего плохого делать:

char output[10]; 
sprintf(output, "%s", "This string is too long"); 

Решение состоит в том, чтобы использовать функцию в качестве snprintf, которая принимает длину параметр:

char output[10]; 
snprintf(output, sizeof output, "%s", "This string is too long, but will be truncated"); 

или, если вы находитесь на системе Windows, чтобы использовать _sntprintf варианты и друзей, которые защищают от перетекания либо входных и выходных строк.

+3

Как вопрос о домашнем задании, я просто хотел бы указать, что 'sizeof output' дает только число * элементов * в' char 'array - обычная практика заключается в использовании:' sizeof array/sizeof array [0] ', который работает, не завися от размера различных типов. Кроме того, он работает и для массивов 'char'. :) –

+0

Хорошая точка. Однако даже это может привести к сбою в некоторых действительно распространенных случаях, таких как передача 'array' функции - в этот момент' sizeof array' равен 4 или 8 в любой современной системе, независимо от количества и размера элементов в нем.Реальное решение - использовать 'std :: vector' или что-то подобное и полностью исключить весь беспорядок. –

7

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

Я уверен, что вы найдете решение :)

+3

Ну, похоже, что другие alredy лишили вас удовольствия от открытия :) –

+1

+1 в любом случае, чтобы дать правильный ответ на вопрос о домашнем задании. –

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