鱼C论坛

 找回密码
 立即注册
查看: 1937|回复: 5

[已解决]大佬们,为啥VS的输出结果不对啊?

[复制链接]
发表于 2023-4-2 17:30:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
同样一行代码比如:
#include<stdio.h>
void main()
{
        int a, b, c;
        a = 5, b = 6, c = 7;
        printf("ab c\tde\rf\n");
        printf("hijk\tL\bM\n");
}
VS2022编译输出就是
fb c    de
hijk    M
我用sublime text输出就是

ab c        de
f
hijk        L    M

这是为什么呢?


最佳答案
2023-4-2 17:39:45
这个问题是由于不同编译器和编辑器对特殊字符的处理方式有所差异导致的。在您的代码中,有如下几个特殊字符:

  • \t - 制表符(Tab)
  • \r - 回车符(Carriage Return)
  • \n - 换行符(Line Feed)
  • \b - 退格符(Backspace)


在Visual Studio 2022(VS2022)和Sublime Text中,这些特殊字符的处理方式略有不同,从而导致了输出结果不同。

在VS2022中:

  • 当遇到 \t 时,它会插入一个制表符(Tab),使输出对齐到下一个制表位。
  • 当遇到 \r 时,它会将输出光标移回行首,因此后面的字符会覆盖掉原本行首的字符。
  • 当遇到 \n 时,它会换到下一行。
  • 当遇到 \b 时,它会将光标向左移动一格,然后输出M字符。因此,L字符被M字符覆盖掉了,最后输出的结果是hijk M。


在Sublime Text中:

  • 当遇到 \t 时,它同样会插入一个制表符(Tab),但制表位可能与VS2022中的不同。
  • 当遇到 \r 时,它的处理方式可能与VS2022有所不同,可能并不会将输出光标移回行首,所以后面的字符不会覆盖掉原本行首的字符。
  • 当遇到 \n 时,它同样会换到下一行。
  • 当遇到 \b 时,虽然\b也是退格符,但它可能没有真正覆盖掉前一个字符。因此,在Sublime Text中,输出结果为hijk L M。


在你的代码中,\r和\b字符的处理差异导致了输出结果在两个环境下不同。可以尝试统一使用一个环境,

或者更改代码以避免使用这些特殊字符,以实现一致的输出效果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-2 17:39:45 | 显示全部楼层    本楼为最佳答案   
这个问题是由于不同编译器和编辑器对特殊字符的处理方式有所差异导致的。在您的代码中,有如下几个特殊字符:

  • \t - 制表符(Tab)
  • \r - 回车符(Carriage Return)
  • \n - 换行符(Line Feed)
  • \b - 退格符(Backspace)


在Visual Studio 2022(VS2022)和Sublime Text中,这些特殊字符的处理方式略有不同,从而导致了输出结果不同。

在VS2022中:

  • 当遇到 \t 时,它会插入一个制表符(Tab),使输出对齐到下一个制表位。
  • 当遇到 \r 时,它会将输出光标移回行首,因此后面的字符会覆盖掉原本行首的字符。
  • 当遇到 \n 时,它会换到下一行。
  • 当遇到 \b 时,它会将光标向左移动一格,然后输出M字符。因此,L字符被M字符覆盖掉了,最后输出的结果是hijk M。


在Sublime Text中:

  • 当遇到 \t 时,它同样会插入一个制表符(Tab),但制表位可能与VS2022中的不同。
  • 当遇到 \r 时,它的处理方式可能与VS2022有所不同,可能并不会将输出光标移回行首,所以后面的字符不会覆盖掉原本行首的字符。
  • 当遇到 \n 时,它同样会换到下一行。
  • 当遇到 \b 时,虽然\b也是退格符,但它可能没有真正覆盖掉前一个字符。因此,在Sublime Text中,输出结果为hijk L M。


在你的代码中,\r和\b字符的处理差异导致了输出结果在两个环境下不同。可以尝试统一使用一个环境,

或者更改代码以避免使用这些特殊字符,以实现一致的输出效果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-4-2 17:35:46 | 显示全部楼层
我问了chatgpt,它的回答是
你的代码是正确的,但是可能会出现一些问题:

1. 需要在程序开头添加 `#include <stdio.h>` 来包含标准输入输出库。

2. `void main()` 可能会引起一些编译器的警告或错误,应该改为 `int main(void)`。

3. 在第二个 `printf` 语句中,`\b` 可能会导致输出的结果不符合预期,因为它会回退光标,但是在控制台中光标的位置可能已经改变了。

如果你想要更好的输出效果,可以使用以下代码:

```c
#include <stdio.h>

int main(void)
{
    int a = 5, b = 6, c = 7;
    printf("ab c\tde\n");
    printf("f\thijk\tL%cM\n", 8);
    return 0;
}
```

输出结果为:

```
ab c    de
f       hijL M
```

其中,`\t` 表示制表符,`\n` 表示换行符,`%c` 表示输出一个字符,`8` 表示 ASCII 码表中的退格符。
结果我用了他的代码就正确了,这是为啥呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-2 17:37:32 | 显示全部楼层
这是因为在不同的文本编辑器中,对于不同的控制字符(例如 \t、\r 和 \b)处理方式可能不一样,导致输出的结果也不同。

在 C 语言中,\t 表示制表符,\r 表示回车符,\b 表示退格符。在输出时,这些控制字符会让光标移动到特定的位置,并按照特定的方式输出文本。

在 Visual Studio 2022 中,输出的结果是 fb c    de\rhijk    M\n。这是因为在 Windows 操作系统中,\r 表示回车符,会将光标移动到行首,然后保持当前行已经输出的内容不变,接着输出新的内容。因此,输出的结果 fb c    de 会覆盖前面的 ab c,然后输出 hijk    M。

在 Sublime Text 中,输出的结果是 ab c        de\nfhijk        L\bM\n。这是因为在 Sublime Text 中,\r 表示换行符,\b 表示退格符,而不是回车符和退格符。因此,输出的结果中包含了两个换行符,一个退格符和一个回车符,导致输出结果与 VS2022 不同。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-4-2 17:40:46 | 显示全部楼层
liuhongrun2022 发表于 2023-4-2 17:37
这是因为在不同的文本编辑器中,对于不同的控制字符(例如 \t、\r 和 \b)处理方式可能不一样,导致输出的 ...

好的,我明白了,谢谢大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-2 17:41:47 | 显示全部楼层
isdkz 发表于 2023-4-2 17:39
这个问题是由于不同编译器和编辑器对特殊字符的处理方式有所差异导致的。在您的代码中,有如下几个特殊字符 ...

好的,我明白了,谢谢大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-17 23:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表