首页 新闻 赞助 找找看

字符串输出

0
悬赏园豆:50 [已解决问题] 解决于 2011-07-29 14:28

string str = "abcdefg\0hijklmn";
Console.WriteLine(str);
Console.WriteLine(str.Length);
这样一段简单的代码,在控制台输出的是abcdefg hujklmn    
                                                  15

winfrom中直接运行的结果是:abcdefg

winfrom中单步调试的结果是: abcdefg15

求解释。。。

马战鹏的主页 马战鹏 | 菜鸟二级 | 园豆:432
提问于:2011-07-29 11:29
< >
分享
最佳答案
0
个人意见,\0是空符号转义符,直接运行会通过一行输出的方式。
进行空符号转义。 所以后面的数据不显示.
如果中间插入Thread.Sleep(100)或者MessageBox.Show();就会执行下面的输出,也就是说主线程就会分为两步来做!
而单步调试运行本身就是分步运行,所以输出结果和Thread.Sleep();方式一样!不过和sleep 时间长短也有关系,我觉得可能与电脑的内存,CPU有关
   string s1 = "aaaaa";
            string ss = "sd\0sd";
            Console.WriteLine(s1);
            Console.WriteLine(ss);
            Thread.Sleep(100);
            Console.WriteLine("ssss"+ss.Length);
            Console.WriteLine(ss.Length);
            Console.WriteLine(ss.Length);
另外当你全部输出后,你会发现,你转义符输出那行与你后面那行永远没有换行。原理同上,你输出后会自动为你加上换行回车符,但是因为空符号转义..后面全部转义为空!
收获园豆:50
辛巴 | 小虾三级 |园豆:622 | 2011-07-29 14:15
这个说法有意思。
刘鸿海 | 园豆:655 (小虾三级) | 2011-07-29 14:58
其他回答(6)
0

我测试了,调试str能接收到全部字符串,但就可视化就只能接到反斜杠前面部分,我想应该是斜杠有特殊含义吧,我也不知道,关注:学习了

love旅途 | 园豆:197 (初学一级) | 2011-07-29 11:40
谢谢!
支持(0) 反对(0) 马战鹏 | 园豆:432 (菜鸟二级) | 2011-07-29 12:05
0

完全不懂C#,不过我觉得是可以试一下刷新输出缓冲区。

pianoid | 园豆:230 (菜鸟二级) | 2011-07-29 11:44
我试试。。。。谢谢提出宝贵意见!!!
支持(0) 反对(0) 马战鹏 | 园豆:432 (菜鸟二级) | 2011-07-29 12:05
汗,你说的是'\0'的问题啊,这难道不是常识么……我还以为你是想问为什么“winfrom中直接运行”没有输出15来着。
支持(0) 反对(0) pianoid | 园豆:230 (菜鸟二级) | 2011-07-29 19:52
0

通常\0是作为字符串的结束符用的。也就是在内存中,系统会在字符串的末尾加上该字符表示字符串已结束。显然对于向控件的属性比如Text赋值和控制台的输出上,.net的处理方式是不同的。前者遇到该符号就认为字符串结束了(没有考虑到用户输入这个字符串的可能性)。而后者的处理是正确的,因为根据asc码表,0是表示空格的,因为前面有转义字符反斜杠。

这个可能是.net的bug。

刘鸿海 | 园豆:655 (小虾三级) | 2011-07-29 13:45
0

你鼠标悬停的时候 结果是正确的

当你打开 “文本可视化工具”时  “\0”以后的都被截取了  这是个bug

杯具程序员 | 园豆:1718 (小虾三级) | 2011-07-29 13:47
0

1、可以转义一下 \

2、\0,看这情况应该是回车

玩吧华华 | 园豆:201 (菜鸟二级) | 2011-07-29 15:00
0

给字符串前面加个@就会全读出来。因为C#中\ 是转义符。

CarsonCui | 园豆:162 (初学一级) | 2011-08-02 18:29
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册