gpt4 book ai didi

c - 在 printf 中使用括号无法正常工作

转载 作者:太空宇宙 更新时间:2023-11-04 10:08:59 25 4
gpt4 key购买 nike

我使用的是 GCC 6.4,我的 printf 语句如下:

printf("Initial Colour: RGB(%s,%s,%s)\n",userdata[k],userdata[k+1],userdata[k+2]);

它打印 )nitial Colour: RGB(1,0.0 这是错误的。注意第二个括号的打印位置。它应该是 Initial Colour: RGB(1,0.0) 正如预期的那样。

如果我使用具有相同 printf 的 GCC 4.5,它会按预期打印。

我的 printf 应该是什么样的?

最佳答案

您正在读取在 Windows 系统上创建的数据文件。行以 \r\n(回车、换行)终止。您要么在同一 Windows 系统上处理此文件,但您正在以二进制 ("rb") 模式打开文件。或者,您正在将文件传输到 Unix 或 Linux(或 Mac)系统并在那里处理它,但是您正在以“二进制”模式传输它,保留 CRLF,而不将其转换为 Unix 单换行符( '\n' ) 惯例。

然后,您正在阅读文本行,可能带有 fgets 。您正在丢弃换行符( '\n' ),但没有丢弃回车符( '\r' )。因此,每一行都以 \r 结尾。

然后,您将该行拆分为字段 userdata[0]userdata[1]userdata[2] ,...。我不确定您是在逗号处还是空格处拆分它,但无论如何,\r 仍附加到最后一个字段。

最后,当您打印出最后一个字段 userdata[k+2] 时,它末尾的回车符导致光标在打印最后一个 ) 之前返回到行首。

您可以通过多种方式解决此问题:

  1. 首先不要创建带有 \r\n 的文件。
  2. 如果在 Windows 系统上处理文件,请以文本("r""rt")模式打开它,而不是二进制。
  3. 如果将文件从 Windows 系统传输到非 Windows 系统,请使用转换行尾的“文本”传输模式。
  4. 从文件中读取行时,去除尾随的 \r\n 字符。
  5. 如果根据空白拆分字段,请在要拆分的空白字符集中包含 '\r'。例如,如果您要调用 strtok,分隔符为 " "" \t",请更改为 " \r"" \t\r"

现在您已经发布了代码,我可以更具体一些。

要实现#4,添加行

if (buffer[strlen(buffer)-1] == '\r') buffer[strlen(buffer) - 1]  = '\0';

在您剥离 \n 的行之后。

要实现#5,将您的两个 strtok 调用更改为

data = strtok(buffer, " \r");

data = strtok(NULL, " \r");

事实上,您也可以将这两行更改为

data = strtok(buffer, " \r\n");

data = strtok(NULL, " \r\n");

这样你就根本不需要换行符了。

还有一件事:你对 feof 的使用是错误的。参见 Why is while(!feof (fp)) always wrong?

关于c - 在 printf 中使用括号无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50287913/

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