我有一个C ++函数,它将LPSTR类型变量拆分为一个char数组(char *) 例如:
this->XMeshTexturePath = FindTexturePath(XMeshTexturePath,d3dxMaterials[i].pTextureFilename);
//the value of XMeshTexturePath is: Models\\Textures\\
//the value of d3dxMaterials[i].pTextureFilename is: BlaBlaBla\\BlaBla\\Cyrex.x
//The Result(XMeshTexturePath) should be like this:"Models\\Textures\\Cyrex.x"
这是我试图写的功能:
int FindTextLength(char* Text){
int length
H = 0; for(int i = 0; i
char* FindTexturePath( char* TexturePath ,LPSTR FileNameToCombine){
int FileLength=0;
int PathAndFileLength=0;
char *FileName = new char;
char *TexPathAndName = new char;
strcpy(TexPathAndName, FileNameToCombine);
PathAndFileLength = FindTextLength(TexPathAndName);
for(int i=0; i<PathAndFileLength; i++){
if( TexPathAndName[i] != NULL){
if(TexPathAndName[i] != '\\'){
FileName[FileLength] = TexPathAndName[i];
FileLength++;
}
else
FileLength = 0 ;
}else break;
}
int PathLength = FindTextLength(TexturePath);
char *Result = new char;
//==============>> // I also tryed this:char *Result = new char[PathLength+FileLength];
//==============>> // char *Result = new char();
for(int i=0; i<PathLength; i++){
if( TexturePath[0] != NULL){
Result[i] = TexturePath[i];
}
else break;
}
for(int i=0; i<FileLength; i++){
if( FileName[0] != NULL){
Result[PathLength + i] = FileName[i];
}
else break;
}
return **Result**; // The Problem is here It should be like this:
// "Models\\Textures\\Cyrex.x"
// But I'm taking one of these as result:
// "Models\\Textures\\Cyrex.x{"
// "Models\\Textures\\Cyrex.xu"
// "Models\\Textures\\Cyrex.xY"
// The last character is random... 8O(
}
Actualy它并没有如此糟糕。问题是,当我声明一个char数组( char * Result = new char; )时,它确实没有达到我在最终结果的最后得到多少字符的长度(结果) 如果你有任何想法或建议,请告诉我,我真的很喜欢这里。 感谢您的任何建议和回应。
Solusion最后添加了这个 功能:
Result[i] = TexturePath[i];
}
else break;
}
for(int i=0; i<FileLength; i++){
if( FileName[0] != NULL){
Result[PathLength + i] = FileName[i];
}
else break;
}
Result[PathLength+FileLength] = '\0' ; // This part is resloving the problem.
// **Thanks for helps**.
return Result;
}
答案 0 :(得分:4)
char *Result = new char[PathLength+FileLength];
Result
指向的数据应以终止字符\0
结尾。或者,当返回Result
指向的字符串时,您将遇到问题。所以,
Result[PathLength+FileLength-1] = '\0' ;
确保您永远不会超出缓冲区,或者更好的选择是使用std::string
。
答案 1 :(得分:1)
new char
为单个字符分配空间。您可能意味着为一组字符分配空间,您可以使用new char[N]
来处理,其中N是数组的大小(例如new char[40]
)
答案 2 :(得分:0)
char *FileName = new char;
char *TexPathAndName = new char;
那应该崩溃。你正在分配1个字符的缓冲区,然后尝试strcpy进入它们,这显然会很快溢出这些缓冲区。另外,请记住,在字符串中的字符之后,您需要为空终止符添加1个额外空间。
答案 3 :(得分:0)
最佳方法是使用std::string
。
如果不这样做,对于字符串长度,有像strlen / wcslen这样的函数。 Windows shell还有一些非常方便的路径操作函数http://msdn.microsoft.com/en-us/library/bb773559%28v=vs.85%29.aspx
它们中的大多数都可以派上用场,通常你会操纵静态长度char path[MAX_PATH]={}
缓冲区。
请记住,最大路径是256左右,对于更深层次的嵌套文件夹,存在一些问题。