gpt4 book ai didi

c - fgets() 读取什么?

转载 作者:行者123 更新时间:2023-11-30 18:40:55 24 4
gpt4 key购买 nike

我必须将程序从 UNIX 迁移到 Windows。该程序是从串口获取数据。在接收它的原始 UNIX 机器中,它读作:

char   my_buffer_a[200];

memset(my_buffer_a, '\0', sizeof(my_buffer_a));

if (fgets(my_buffer_a, sizeof(my_buffer_a), file_p))
{
n = sscanf("%d\t%d\t...%d\n0x0A",
my_record.field1, my_record.field2, ...)
....
}

我知道 fgets() 将读取直到 EOF 或换行符。这意味着在 my_buffer_a 中,我希望末尾有 '\n' 。然而令我惊讶的是,还有还有0x0A! (这是否意味着两个换行符?)这里发生了什么?

我担心的另一件事是 Unix 和 Windows 中换行符的定义。它们在 Unix 和 Windows 中并不相同。我的意思是在我转换之后,当我这样做时sscanf ,我必须做sscanf("%d\t%d\t...%d\r\n (或者 sscanf(%d\t%d\t...%d\r0x0D\n0x0A 同时保持奇怪的逻辑)?

最佳答案

scanf 格式字符串中的换行符并不专门在输入中查找换行符 - 它只是跳过空格(任何空格)。对于制表符也是如此。此外,大多数 scanf 格式说明符(除了 %c%[ 之外的所有内容)都会跳过空格。所以总的来说:

  • 您不应该在格式字符串中使用 \t\r\n (%[..] 内除外),因为它只会让人们感到困惑。使用空格代替,效果相同

  • 您应该避免在格式字符串中使用多余的空格,因为它们没有任何作用,只会让人们感到困惑。

因此,通过上述操作,您的 sscanf 调用将变为:

sscanf("%d%d ...%d 0x0A",

明确地说,这会读取两个数字,后跟三个句点,再后跟另一个数字,最后是字符串 0x0A(4 个字符)。这 6 件事之间可能有(或没有)任何空格,它将被忽略。

就 Windows 与 Unix 而言,在 Windows 中,行尾会有额外的回车符 (\r)。但这些只是空格,因此将像任何其他空格一样被 scanf 跳过。所以你可以忽略它们。

关于c - fgets() 读取什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24362237/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com