Дополнительный символ в конце массива символов (char * Result = new char) 8OI - PullRequest
0 голосов
/ 10 июня 2011

У меня есть функция 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

ч = 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; ), он не является метромсколько стоит длина Я беру лишний символ в конце конечного результата ( Результат ) Я действительно застрял здесь, если у вас есть какие-либо идеи или предложения, дайте мне знать. Спасибо за любой совет иотклик.

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

Ответы [ 4 ]

4 голосов
/ 10 июня 2011
char *Result = new char[PathLength+FileLength];

Result указанные данные должны заканчиваться символом завершения \0.Или вы столкнетесь с проблемами, когда вернете такую ​​строку, указанную Result.Итак,

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

Убедитесь, что вы никогда не переполняете буфер, или даже лучше использовать std::string.

1 голос
/ 10 июня 2011

new char выделяет место для одного символа. Вы, вероятно, хотите выделить место для массива символов, что вы можете сделать с помощью new char[N], где N - размер массива (например, new char[40])

0 голосов
/ 10 июня 2011

Лучшим подходом является использование std::string.

Если нет, для длины строки есть такие функции, как strlen / wcslen.Оболочка Windows также имеет несколько очень удобных функций для манипулирования путями http://msdn.microsoft.com/en-us/library/bb773559%28v=vs.85%29.aspx

Большинство из них могут пригодиться, и обычно вы манипулируете статической длиной char path[MAX_PATH]={} буферов.

Помните, что максимальный путь равен 256или около того, для более глубоких вложенных папок есть некоторые проблемы.

0 голосов
/ 10 июня 2011
char *FileName = new char;
char *TexPathAndName = new char;

Это должно разбиться. Вы выделяете 1-символьные буферы, а затем пытаетесь их запрограммировать, что явно очень быстро переполнит эти буферы. Также помните, что после символов в строке вам нужно 1 дополнительный пробел для нулевого терминатора.

...