Экранирование% s внутри sprintf для создания переменной ширины поля для sscanf - PullRequest
1 голос
/ 25 ноября 2011

Я хотел бы знать, как можно избежать "% * s" в вызове sprintf. Например, у меня есть следующий фрагмент кода:

sprintf(log_buffer,"1234 567 89");

strcpy(format,"%*s"); 

sprintf(format1, " %%%ds %%%ds ",5,5); 

printf("\n Format is : %s ",format); 

printf("\n Format1 is : %s ",format1); 

strcat(format,format1); 

printf("\n new format is : %s ",format); 

sscanf(log_buffer,format,name,name1);

printf(" Name is 1: %s \n",name);

printf(" Name is 2: %s ",name1);

Это отлично работает.

Это дает мне:

Format is : %*s 

Format1 is : %5s %5s

new format is : %*s %5s %5s

Name is 1: 567 

Name is 2: 89

Могу ли я не использовать strcpy и игнорировать% * s внутри самого sprintf? Я пытался избежать его внутри sprintf, но я думаю, что это неправильно, поскольку я получаю ошибку сегментации.

sprintf(format1, " \%*s %%%ds %%%ds ",5,5);

1 Ответ

1 голос
/ 25 ноября 2011

Похоже, вы уже знаете, как избежать % входа в sprintf (путем добавления префикса к другому %) - вы делаете это правильно для %%%ds.

Что вы хотитеis:

sprintf(format1, " %%*s %%%ds %%%ds ",5,5);

Редактировать: Причина, по которой это происходит с ошибками, заключается в том, что \%*s интерпретируется как буквенный обратный слеш, за которым следует строка, оканчивающаяся NULL;поэтому sprintf пытается интерпретировать 5 как строку, оканчивающуюся NULL, что явно не является.Он будет уходить в запрещенную память в поисках NULL-байта и segfaulting.

...