printf("%c",0x0a)输出的是 0X0D+OXOA 而我想输出OX0A应该怎么写

hollandjzy 2010-06-29 10:43:02
如题
printf("%c",0x0a)输出的是 0X0D+OXOA 而我想输出OX0A应该怎么写
...全文
870 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
fibbery 2010-07-02
  • 打赏
  • 举报
回复
其实这是一个很简单的问题。


输出有两种模式,文本模式和二进制模式,在文本模式下,windows系统会对换行符进行转换,转换成回车换行,这一点与Unix不一样,Unix中,换行就是换行(\n)。这也是为什么在不同的系统中ftp有两种模式一样,当你使用ftp从Unix向Windows传输文件时,如果是文本模式,传输过程中遇到的\n会转换成\r\n,反之亦然。

如果楼主想要在windows中的文本文件换行符只使用\n而不添加\r,那么你可以使用二进制模式打开文件,并向文件中写入\n就行了,没有那么复杂;对于标准输出,\r\n和\n对于你的视觉又有什么影响呢?
arong1234 2010-06-30
  • 打赏
  • 举报
回复
如前所述,这已经不可能了[Quote=引用 4 楼 hollandjzy 的回复:]
我就只需要输出0X0A 字符 不是当做回车换行用
[/Quote]
agwtpcbox1 2010-06-30
  • 打赏
  • 举报
回复
是输出“0X0A”这四个字符????还是什么????
agwtpcbox1 2010-06-30
  • 打赏
  • 举报
回复
是输出“0X0A”这四个字符????还是什么????
oyster2008 2010-06-30
  • 打赏
  • 举报
回复
在标准输出stdou连接到控制台的情况下没法实现
如果stdout被重定向了,倒是可以实现
bobo364 2010-06-30
  • 打赏
  • 举报
回复
新鲜,头一回听说有人要printf这个,mark
arong1234 2010-06-30
  • 打赏
  • 举报
回复
那就不是字符,而是数字了[Quote=引用 16 楼 njuhuangmy 的回复:]
用02x 来控制输出格式

printf("0x%02x", 0x0A);
[/Quote]
njuhuangmy 2010-06-30
  • 打赏
  • 举报
回复
用02x 来控制输出格式

printf("0x%02x", 0x0A);
arong1234 2010-06-30
  • 打赏
  • 举报
回复
\n本来就是0x0A,两个是同一个字符。这是“字符模式”的特点,除非你能改变标准输出的字符模式,否则不可能[Quote=引用 11 楼 hollandjzy 的回复:]
printf("\n") 输出也是 0X0D 0X0A啊 就没有办法吗
[/Quote]
hollandjzy 2010-06-30
  • 打赏
  • 举报
回复
自己再顶 等待解决方法
hollandjzy 2010-06-30
  • 打赏
  • 举报
回复
等高手
fancanqin 2010-06-30
  • 打赏
  • 举报
回复
0X0A就是回车啊
hollandjzy 2010-06-30
  • 打赏
  • 举报
回复
printf("\n") 输出也是 0X0D 0X0A啊 就没有办法吗
arong1234 2010-06-30
  • 打赏
  • 举报
回复
cool!还是很疑惑楼主要少一个\r能达到什么结果!这应该只对诸如行程打印机之类的东西有意义。控制字符的具体位置来实现DOS的排版,实际是应该没有多少实际用处的(能不能达到这个目的也很怀疑)[Quote=引用 26 楼 zhao4zhong1 的回复:]
纠正上帖


C/C++ code
/* SETMODE.C: This program uses _setmode to change
* stdin from text mode to binary mode.
*/

#include <stdio.h>
#include <fcntl.h>
#include <io.h>

void main( void )
……
[/Quote]
赵4老师 2010-06-30
  • 打赏
  • 举报
回复
上帖中源代码第二行
* stdin from text mode to binary mode.
应改为
* stdout from text mode to binary mode.
赵4老师 2010-06-30
  • 打赏
  • 举报
回复
纠正上帖

/* SETMODE.C: This program uses _setmode to change
* stdin from text mode to binary mode.
*/

#include <stdio.h>
#include <fcntl.h>
#include <io.h>

void main( void )
{
int result;

/* Set "stdout" to have binary mode: */
result = _setmode( _fileno( stdout ), _O_BINARY );
if( result == -1 )
perror( "Cannot set stdout to have binary mode!" );
else {
printf( "'stdout' successfully changed to binary mode\n" );
printf("%c",0x0a);
}
}
赵4老师 2010-06-30
  • 打赏
  • 举报
回复
关键是stdout这个标准输出流默认是文本方式打开的,所谓文本方式就是对单个0x0D或0x0A会自动转换为0x0D,x0A。除非找到暂时将stdout改为二进制方式的办法。
比如
_setmode(stdout,_O_BINARY);
pf_ma 2010-06-30
  • 打赏
  • 举报
回复
参考MSDN关于以下内容的说明:

_setmode()、fopen()、_fmode、_O_TEXT、_O_BINARY
Yanger_xy 2010-06-30
  • 打赏
  • 举报
回复
你是要输出0X0A这个字符串还是要输出回车啊?
如题
printf("%s","0x0a");//输出字符串
printf("%c", '\n');//输出回车
deviosyan 2010-06-30
  • 打赏
  • 举报
回复
什么是0x0d和0x0a,可能大部分人都知道是回车和换行字符,但那个是回车,那个是换行?估计很多人都一时说不清楚了---也许你不相信,那就调查下周围的同事吧,估计会包含以下字眼“大概。我记得。回车是0x0d吧”。这次我移植arm-linux C的程序,至VC++,发现了很多不同,尤其是这个回车换行浪费我一上午的时间,我决定借此机会彻底搞定他们,这两个令人讨厌的家伙。

先说下浪费我一上午的那个东西----教训是很重要的,希望大家不要重蹈我的覆辙----,在arm-linux下,写二进制文件,打开文件的时候这样写就可以了fp_wthdisk = fopen(file_pathname,"w");,以w格式写就可以了。把这段程序移植到vc++后,发现一旦我向文件写入0x0a,前边就会自动加上0x0d,我以为是我写入数组的问题,反复检查也没有找到毛病,后来同事问我:“你是不是二进制格式写入的文件?”我说:“是呀,fwrite w格式,没有问题呀”,后来他说,你试试“wb格式写入一下”,改为wb后,果真就好了,厉害!,我对他竖起了大拇指。

看到这里,上边促使我下决心搞清楚回车换行的原因说完了。我想可能有人会犯同样错误的。但如果你对以下几个问题,都知晓了,就不必浪费时间,继续看下去了。

1.在Windows XP Visual C++下,按下回车键,系统获得的字符是0x0d还是0x0a,还是0x0d和0x0a?

2.回车(0x0d)的作用是回到本行的行首位置,表示本行已经输入完毕,停留在最后一个位置,还是光标转移到下一行的起始位置?

1.的答案是仅获得字符 0x0d

2.答案是回车的作用只是移动光标至该行的起始位置

注意:回车和换行在不同环境下的意义不同,正如sleep(1)和Sleep(1)【注意S大写】这两个函数的不同一样,sleep(1)在linux下表示延时1s,而Sleep(1)在vc++下表示延时1ms,如果不依据环境来讨论回车和换行,是无意义的,只能是让人们误入歧途和浪费时间。

我只在arm-linux C和vc++下做了试验,请大家在接触其它语言环境下,小心推广,不行就自己动手做试验,最可靠。在arm-linux C和vc++下回车换行的意义如下。

回车 代码:CR ASCII码:\ r ,十六进制,0x0d,回车的作用只是移动光标至该行的起始位置;

换行 代码:LF ASCII码:\ n ,十六进制,0x0a,换行至下一行行首起始位置;

Linux和windows下,回车试验
CODE:
sprintf(versionbuf,"%s","TEST_VERSION_1_0_11\rabcdefg\r34567\n");
printf("%s",versionbuf);

均打印输出:34567fgRSION_1_0_11,证明了以上结论。

其实回车和换行之所以把大家搞迷糊的一个重要原因,是大家把键盘的 “回车键”,0x0d表示“回车”,我们在windows下的txt文件下敲下的回车键等情况搅在了一起。在键盘上敲下回车键,在不同软件下获得字符大有不同。

Windows下在txt文件中敲下回车键,然后16进制观察,你会发现获得了2个字符,0x0d和0x0a,这个大家都知道,但这不意味着,在任何情况下敲下回车键,都会获得0x0d和0x0a。

在linux下,你对一个文件,敲下回车键,你就会发现,它每次只增加一个字符。
加载更多回复(9)

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧