0

我有一个 C++ 函数,它将 LPSTR 类型变量拆分为一个字符数组 (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(
}

实际上它并没有那么糟糕。问题是当我声明一个 char 数组(char *Result = new char;)时,它不知道长度是多少我在最终结果(结果)的末尾增加了一个额外的字符,我真的被困在这里如果您有任何想法或建议,请告诉我。感谢您的任何建议和回应。

解决方案是在函数末尾添加这个:

            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;
}
4

4 回答 4

5
char *Result = new char[PathLength+FileLength];

Result指向的数据应以终止字符结尾\0。或者当返回这样一个由Result. 所以,

Result[PathLength+FileLength-1] = '\0' ;

确保您永远不会超出缓冲区,甚至更好的选择是使用std::string.

于 2011-06-09T23:16:15.900 回答
1

new char为单个字符分配空间。您可能的意思是为字符数组分配空间,您可以使用new char[N]其中 N 是数组的大小(例如new char[40]

于 2011-06-09T23:16:25.777 回答
0
char *FileName = new char;
char *TexPathAndName = new char;

那应该崩溃。您正在分配 1 个字符的缓冲区,然后尝试将 strcpy 放入其中,这显然会很快溢出这些缓冲区。另外,请记住,在字符串中的字符之后,空终止符需要 1 个额外的空间。

于 2011-06-09T23:15:06.997 回答
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 左右,对于更深的嵌套文件夹存在一些问题。

于 2011-06-09T23:29:06.340 回答