C:字符串中包含“\0”如何才能把它当作有效字符来处理?
比如在文件路径中,包含“\0”的话,可以用“\\0”代替,但是,如果文件路径为动态取得,该怎么办?比如:c:\test\000\abc。
如果说文件路径我们可以在写代码时进行限定不用,但要处理注册表我们就没办法了,我们不能要求所有人都不用“\0”吧!?
而目前我遇到的问题就是,API读注册表,发现有些项读不出来,打开注册表查看,才发现该键键值为注册表路径,其中就包含“\0”,格式如:SORTWARE\Main\000123\{0a4252a0-7e70-11d0-a5d6-28db04c10000},该如何处理?
[解决办法]
在前面再加一个'\'。
这个'\'是个转意字符
[解决办法]
不成问题吧,“\0”只是C语言字面的表示法,内存是0x00,C的字符串函数准确的说是“遇到0x00作为结束符,而不是遇到\0作为结束符”
字符串中的\0是“两个”实际存在的ascii字符“\”和“0”,和C的“\0”根本就是两码事,你肯定是其他地方有问题
一个简单的实验就是,你在一个文本文件中保存“C:\0\XXX”这个字串,再用文件IO读出来存进字符串,字符串里肯定是完整的,不存在所谓的截断问题
[解决办法]
你这与\0无关。
你操作SORTWARE\Main\000123\{0a4252a0-7e70-11d0-a5d6-28db04c10000}
时,把\替换为\\就好了。
SORTWARE\\Main\\000123\\{0a4252a0-7e70-11d0-a5d6-28db04c10000}
[解决办法]
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
提醒:
“学习用汇编语言写程序”
和
“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)”
不是一回事!
不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
[解决办法]
不知道LZ有米有用过这个API:GetLogicalDriveStrings
它用于获取本地磁盘的盘符列表
返回的buffer格式为"C:\\\0D:\\\0E:\\\0F:\\\0G:\\\0"
若LZ想用printf或cout输出buffer,可能要让LZ失望了,因为只能输出"C:\\\0"
原因很简单,字符串是以'\0'结束的
所以若想将这个buffer拷贝到另一个内存段buffer2中
就不能把buffer当作字符串,只能做二进制流处理
用memcpy(buffer2, buffer, 20)
[解决办法]
告诉LZ一个简单的调试方法,就是将char array的内容一个一个的打出来(打ascii),或者下个断点,直接查看内存内容。
比如有个路径,它是C:\000\001,如果是直接用api得到的,char array的内容将是
67 58 92 48 48 48 92 48 48 49 0
还是刚才那个路径,如果要用字面量来表示的话,才是"C:\\000\\001"
望LZ先实践下,再来看是否真正理解了转义。
[解决办法]
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <time.h>#include <unistd.h>int main(){ char *p = "SORTWARE\Main\000123\{0a4252a0-7e70-11d0-a5d6-28db04c10000"; printf("%s\n", p);}[root@bogon temp]# ./t1SORTWAREMain
[解决办法]
to 38楼:
char *p = "SORTWARE\Main\000123\{0a4252a0-7e70-11d0-a5d6-28db04c10000";
这里的应该为
char *p = "SORTWARE\\Main\\000123\\{0a4252a0-7e70-11d0-a5d6-28db04c10000";
Jacky说的"\0"用字符串表示应该是"\\0"。
[解决办法]
我想我可能猜到了
楼主读出的键值本身,应该是“SORTWARE\Main\000123\{0a4252a0-7e70-11d0-a5d6-28db04c10000}”这个正确无误的字符串
但楼主在处理这个字符串的时候,十有八九使用了“format”或者“printf”等具有转义功能的函数
这样,原本字符串中正确无误的“\0”两个字符就在这个函数中被转换成了'\0'一个字符
[解决办法]
定义的字符串应该是酱紫的
char *p = "SORTWARE\\Main\\000123\\{0a4252a0-7e70-11d0-a5d6-28db04c10000";
[解决办法]
不是常量串的话,如果是从其它地方获取的,是不会存在出现\0的情况, 这个转义字符只适用于在程序代码中输入的串才会有.
[解决办法]
字符串转义只有在直接手写字符串,即char* p = "字符串\0",\0才会转义,
如果"字符串\0"是从已存在的内存取则不会转义,
如果按lz那样,每次内存复制字符串一次都要转义
LZ毕竟图样
[解决办法]
我在二次的时候是会自己补\,没什么好招。
你玩xml的时候,自己没转过吗?呵呵呵
[解决办法]
把\0换成\\0试试吧,我记得原来貌似有遇到过你这样的问题的
[解决办法]
这样的问题还需要想吗?
在写源代码的时候自然要写成'//',因为编译器会将转义字符转义。
但是从机器上读取的时候是这样读取的:'/','0' 转成ASCII码值并不是0
[解决办法]
lstrcpy(destination, lpRegPath); lstrcat(destination,start->vpID); lstrcat(destination,endPath); //MessageBox(hwnd,destination,"REG_BINARY",MB_OK); //打开某键 lResult = RegOpenKeyEx( HKEY_LOCAL_MACHINE, destination, 0, KEY_READ, &hKey );