我想知道如何在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);
答案 0 :(得分:1)
看起来您已经知道如何在%
中转义sprintf
个标记(通过添加其他%
作为前缀) - 您正在为%%%ds
正确执行此操作。< / p>
你想要的是:
sprintf(format1, " %%*s %%%ds %%%ds ",5,5);
编辑:它的segfaulting是因为\%*s
被解释为文字反斜杠,后跟一个以NULL结尾的字符串;所以sprintf
试图将5解释为以NULL结尾的字符串,显然它不是。它将运行到禁止的内存中寻找一个空字节和segfaulting。