急急!C build源代码中如何表示 0 ASCII码?(200分)

  • 主题发起人 主题发起人 wenjinshan
  • 开始时间 开始时间
W

wenjinshan

Unregistered / Unconfirmed
GUEST, unregistred user!
我想在源代码中表示6个0的ASCII码:"/0/0/0/0/0/0"(AnsiString),
可是编译器自动把它当作普通字符串(char),第一个0之后的东西自动省略了。
怎么办?
 
"/30/30/30/30/30/30"
 
不是字符(数字)“0”!而是ASCII码的0,0在char中表示字符串结束。
我需要6个“/0”。
 
不用想了,标准的C中是没有办法表示这种字符串的。
 
VC中是可以的,_T("")
就不知道C++build是用什么方法了?!
 
应该是"/0x00"或"/0x0",都可以
又如下面的语句是将字符串str中的回车换行符转换为Html语法中的<BR>
TReplaceFlags Flags ;
Flags << rfReplaceAll;
str = StringReplace(str, "/x0D/x0A", "<BR>", Flags);
 
“/0”、“/x0”、“/0x0”这些都是不行的。
因为0有特殊含义,其它ASCII码都可以。
编译器自动把第一个0后的内容去掉。
 
AnsiString s1 = "/0/0/0/0/0/0";
//不行,编译器会把s1视为NULL,不分配数据存储空间
char s2[6] = "/0/0/0/0/0/0";
//OK,尽管s2里什么也有效字符也没有,但它已经分配了数据存储空间
你得讲清楚你想怎么用,我们才好分析出该如何解决。
 
对啊,char s[6] = "/0/0/0/0/0/0";
就行了,你是不是想在文件中写入这些东西啊,没问题啊。
 
不是,我是想得到这样一个AnsiString字符串:
“hello /xff/x0/xff Hello world!/n”,可是编译器自动把
字符串当作“hello /xff”来处理了,后面的字符被删除。
虽然可以使用:
Move("hello /xff",buf,7);
Move("/xff Hello world!/n",&amp;buf[8],15);这样太烦了!且容易出错!
VC就可以这样做:_T(“hello /xff/x0/xff Hello world!/n”),_T表示AnsiString,
而不是char []
C++build用等效的用法吗??
 
这个问题应该是源于AnsiString的处理方式有关的,可以叫做AnsiString的一个附作用吧(不
应该叫Bug)。当给AnsiString赋值时,它并不拷贝字符串的数据,而只是将其数据地址指向
被引用的对象,因此处理到'/0'时就会认为字符串已经结束了。
建议不要用'/0'作为一个字符串间各段子串的分隔符。不瞒你说,我实在不知道这样的字符
串该如何使用——不能用strlen, strcpy, strcat, sprintf...所有的C字符串处理函数都不
能正确地用于这样的字符串,你根本不能把它当字符串来处理,当然也就无法用于AnsiString了。
 
可是,VC和DELPHI都可以正确使用,难道C++build就不行了吗?
 
都行?我试了的结果是不行(VC),你把代码贴出来分析一下。
 
C#的代码:
String s;
s="ABC /0 ABC";
button1.Text=s.Substring(5,3);
得到的是" AB",说明/0后面的还有效.
如果是delphi,"ABC " + #0 + " ABC",也有效.
但C++build就不行.
 
我只能说这就是C/C++处理字符串的特点,你在VC下试一下吧,也不行的。
 
vc 可以,请看上面的代码.
 
这是在VC7下编译通过的代码,但我不知道_T放在哪里能够实现你所说的效果。
void CStringTstDlg::OnBnClickedOk()
{
int l;
CString S1 = _T("Hello /x0 World/x0!");
l = S1.GetLength();
//l=6
MessageBox(S1);
OnOK();
}
 
int l;
string S1 = "Hello /x0 World/x0!";
l = S1.Length;
//l=15
button1.Text=S1;
MessageBox是不行的,因为它不处理字符串'/0'后面的,试试上面的代码吧.
可以不用_T
 
pascal sample
D:Pchar;
GetMem(pnt,6);
for i:=1 to 6do
begin
Pnt^=0;
inc(Pnt);
end;
D:=Pnt;
 
后退
顶部