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

标签 c string output scanf imperative

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

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   

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

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++;
}

当前输出为:

Weekday: Fre18.00FCNSDR3.211
Day: 17
Month: 7
Year: 2015
Start: 18.00FCNSDR3.211
Home team: FCNSDR3.211
Away team: SDR3.211
Score: 0 - 2
Viewers: 3.211

预期输出是:

Weekday: Fre
Day: 17
Month: 7
Year: 2015
Start: 18.00
Home team: FCN
Away team: SDR
Score: 0 - 2
Viewers: 3.211

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

非常感谢所有帮助。

最佳答案

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

%3s 实际上读取了 4 个字节。 Fre\0。如果您使用的数组太小,则会覆盖 \0,导致字符串包含内存中接下来出现的任何内容(在本例中为更多字符串)。

关于c - sscanf 用于格式化文件中的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40808841/

相关文章:

c - 如何在 C 中定义结构 'Atom'?哪个更好?为什么?

java - 有没有一种方法可以用java递归地检查字符串是否至少包含一个大写字母?

c - 程序运行后没有输出?

file - 如何以进程的百分比检查 CPU 和内存负载,然后将其输出到文件?

java - JTextPane 在上一行之后打印文本

c - 在 C 中使用加倍方案设置数组值的正确方法?

c - 在 mkfifo 中授予 super 用户进程的权限

比较用户输入的字符串

反转字符串的代码不清除以前的值

c++ - 如何在不复制的情况下使用 std::string?