我有以下sscanf
声明:
sscanf(line, "%*s %511s %511s",protocol,hexdata)
现在,line包含以下格式" a b c "
。很明显,我通过给予a
来忽略值%*s
。我将b
和c
的值放入协议和数据中。
我想做的是我不想硬编码511.我无法这样做。我尝试了以下但它似乎不起作用。
sprintf(log_buffer,"1234 56789");
printf("\n Buffer is : %s \n",log_buffer);
strcpy(format,"%*s "); // gives %*s
sprintf(format1, "%%%ds", 5); // gives %5s
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);
printf(" Name is : %s ",name);
printf(" \n Size of name %d ",strlen(name));
这给了我垃圾值。
示例输出:
Buffer is : 1234 56789
Format is : %*s
Format1 is : %5s
new format is : %*s %5s
Name is : �
8r�2�%*s %5s
Size of name 15
这里有什么问题?我只需要防止硬编码变量字段。
答案 0 :(得分:2)
我的声明如下:char format [5] = {0};
format
字符串可以容纳4个字符和零终结符。这对"%*s %5s"
来说还不够!
增加数组大小。
答案 1 :(得分:1)
我怀疑你在一个char数组中覆盖了内存。您尚未显示format,format1, name
和log_buffer
的尺寸,所以我只是猜测,因为代码看起来还不错。
在每个数组的大小为32字节的情况下运行时,它会提供以下输出(VS2008):
Buffer is : 1234 56789
Format is : %*s
Format1 is : %5s
new format is : %*s %5s Name is : 56789
Size of name 5
答案 2 :(得分:0)
您应该注意格式字符串中提供的511值并不意味着读取的实际字符串具有该字符数。
提供511值以指示sscanf
可以将多少字符写入目标变量(示例中为name
)。您必须将其视为防止缓冲区溢出的安全措施。