在sscanf中指定可变字段宽度

时间:2011-11-23 09:53:10

标签: c string printf scanf

我有以下sscanf声明:

sscanf(line, "%*s %511s %511s",protocol,hexdata)

现在,line包含以下格式" a b c "。很明显,我通过给予a来忽略值%*s。我将bc的值放入协议和数据中。

我想做的是我不想硬编码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

这里有什么问题?我只需要防止硬编码变量字段。

3 个答案:

答案 0 :(得分:2)

  

我的声明如下:char format [5] = {0};

format字符串可以容纳4个字符和零终结符。这对"%*s %5s"来说还不够!

增加数组大小。

答案 1 :(得分:1)

我怀疑你在一个char数组中覆盖了内存。您尚未显示format,format1, namelog_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)。您必须将其视为防止缓冲区溢出的安全措施。