Дополнительный символ в конце массива символов (char * Результат = новый символ) 8OI

#c #visual-c #directx #directx-9

#c #visual-c #directx #directx-9

Вопрос:

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

Решение заключается в добавлении этого в конце функции:

             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] = '' ;  // This part is resloving the problem.
                                            // **Thanks for helps**.
    return Result;
}
  

Ответ №1:

 char *Result = new char[PathLength FileLength];
  

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

 Result[PathLength FileLength-1] = '' ;
  

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

Комментарии:

1. Конечно, PathLength и FileLength должны быть правильно инициализированы перед выполнением этого.

2. Это ответ! Я просто добавил этот символ завершения непосредственно перед возвращением переменной результата. И это работает просто идеально, спасибо за информацию.

3. Разве вам не нужна длина пути длина файла 1? Для нулевого ограничителя?

4. @PsyCoder — Пожалуйста, посмотрите правку. То, что упомянул @Coder, очень важно.

Ответ №2:

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

Ответ №3:

 char *FileName = new char;
char *TexPathAndName = new char;
  

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

Комментарии:

1. Я принимаю вашу информацию. Но когда я начал программировать на DirectX, я увидел слишком много невозможных вещей, таких как это: D Это действительно не сокрушительно: P Также спасибо вам за ваше время.

2. Если это не приводит к сбою, это потому, что вам повезло, а не потому, что это правильно.

3. Он разбился, как вы сказали. Я его больше не использую 🙂

Ответ №4:

Лучший подход — использовать std::string .

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

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

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