转义sprintf中的%s以构造sscanf的可变字段宽度

时间:2011-11-25 09:29:48

标签: c scanf

我想知道如何在sprintf调用中转义“%* s”。  例如,我有以下代码:

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并忽略sprintf本身中的%* s吗?我尝试在sprintf中转义它,但我想这是不正确的,因为我得到了分段错误。

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

1 个答案:

答案 0 :(得分:1)

看起来您已经知道如何在%中转义sprintf个标记(通过添加其他%作为前缀) - 您正在为%%%ds正确执行此操作。< / p>

你想要的是:

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

编辑:它的segfaulting是因为\%*s被解释为文字反斜杠,后跟一个以NULL结尾的字符串;所以sprintf试图将5解释为以NULL结尾的字符串,显然它不是。它将运行到禁止的内存中寻找一个空字节和segfaulting。