【问题标题】:specifying variable field width in sscanf在 sscanf 中指定可变字段宽度
【发布时间】:2012-01-04 14:59:48
【问题描述】:

我有以下sscanf 声明:

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

现在行由以下形式" a b c " 组成。很明显,我通过提供%*s 忽略了a 的值。我将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

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

【问题讨论】:

  • 你的 char 数组的声明是什么样的?
  • 我的声明如下 char log_buffer[20]={0},format[5]={0},name[8]={0},format1[5]={0}
  • 它适用于我:ideone.com/wkWzN
  • 哦,真是个大错 :( 非常感谢!我真傻。

标签: c string printf scanf


【解决方案1】:

您应该注意,格式字符串中提供的 511 值并不意味着实际读取的字符串具有该字符数。

提供 511 值是为了指示 sscanf 可以将多少个字符写入目标变量(在您的示例中为 name)。您必须将其视为一种安全措施,以防止缓冲区溢出。

【讨论】:

  • 是的,我知道 511 的重要性。但是想想如果明天有人将我的缓冲区长度从 512 即 line[512] 更改为 line[1024] 会发生什么。然后 511 也需要更改,否则会出现错误,如果新人看到代码,将很难捕捉到。所以我想做的是 line[LENGTH] 并使用相同的#define LENGTH 来构造 sscanf(没有硬编码)。猜测更好的编码标准
【解决方案2】:

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

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

增加数组大小。

【讨论】:

    【解决方案3】:

    我怀疑您正在覆盖您的一个 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 
    

    【讨论】:

    • 是的,我在为格式分配缓冲区时犯了一个可怕的错误:(我现在明白了。谢谢
    猜你喜欢
    • 1970-01-01
    • 2020-03-07
    • 2012-10-21
    • 2015-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多