sscanf用于格式化文件中的字符串

时间:2016-11-25 16:06:40

标签: c string output scanf imperative

作为家庭作业的一部分,我需要使用以下格式加载包含数据的文件:

<xsl:for-each-group select="ApplicationItem[contains(@LayoutPath,'Attachments.Package.Attachment')]" group-by="substring-before(substring-after(@LayoutPath, 'Attachments.Package.Attachment['), ']')">
            <Attachment>
                <xsl:for-each select="current-group()">
                    <xsl:attribute name="UniqueID" select="current-grouping-key()"/>
                    <xsl:attribute name="Filename" select=".[contains(@LayoutPath,'Filename')]/@Value"/>
                    <xsl:attribute name="URI" select=".[contains(@LayoutPath,'URI')]/@Value"/>
                </xsl:for-each>
            <Attachment>
</xsl:for-each-group>

为此,我使用fgets将字符串存储在临时字符串中,之后使用sscanf格式化字符串,同时逐行遍历文件。

<Package>
   <Attachment UniqueID="bfd0b74d-2888-49d9-a986-df807f08ad8a"
      Filename=""
      URI="https/.test.pdf"/>
   <Attachment UniqueID="bfd0b74d-2888-49d9-a986-df807f08ad8b"
      Filename=""
      URI="google.com"/>
<Package>

当前输出为:

R1  Fre     17/07/2015   18.00     FCN - SDR     0 - 2     3.211   
R1  Lor     18/07/2015   16.00     FCM - VFF     2 - 0     7.232   

预期输出为:

while(fgets(temp, MAX_LINE_SIZE, input_file)!= NULL) {
  sscanf(temp, 
    " %*s %3s %d / %d / %d %s %3s - %3s %d - %d %6s",

    round[i].match[j].weekday, 
    &round[i].match[j].day, 
    ..... And so on ....
  j++;
}

sscanf中带有%s占位符的字符串似乎出于某种原因将它们组合在一起。

所有帮助都非常赞赏。

1 个答案:

答案 0 :(得分:1)

您确定要将Fre之类的字符串存储在4字节字符数组中吗?

%3s实际读取4个字节。 Fre\0。如果你使用的数组太小,那么你会覆盖\0,导致字符串包含内存中的下一个内容(在这种情况下,更多的字符串)。