Вместо строки выводится билебирда c++

Рейтинг: -1Ответов: 1Опубликовано: 29.04.2015

Выводится cout << nameFigure << endl непонятно что, хотя в отладчике с breakpoint'ами значение nameFigure такое, как нужно. Что не так?

   int main(){
       // setlocale( LC_ALL,"Russian" );              
        ifstream fileInput;
        ofstream fileOutput;
        char* nameOfFileInput; 
        char* nameOfFileOutput;
        char *nameFigure;
        char nameFigure1[255];
        char strCur[255];
        int i;
        CalcFigure *calcFigure;

        nameOfFileOutput = "output.txt";
        nameOfFileInput = "input.txt";
        fileInput.open(nameOfFileInput, ios::in);
        fileOutput.open(nameOfFileOutput, ios::out);

        if (!fileOutput){
            cout << ("File output has not created");
            return -1;
        }

        if (fileInput.is_open())
        {
            i = 0;
            while (fileInput.good())
            {                          
                fileInput.getline(strCur, 255);
                calcFigure = new CalcFigure(strCur);
                nameFigure =  calcFigure -> GetNameFigure();    
                cout << nameFigure <<endl;//вот тут непонятно что выводится
               //вот тут непонятно что выводится


                i++;
            }
            fileInput.close();
        }
        else cout << "Unable to open file";

        fileOutput.close(); 
        system("pause");
        return 0;

}

Класс CalcFigure

#pragma once
#include "Stdafx.h"
#include "Shape.h"

class CalcFigure
{
public:
    CalcFigure(char str[]);
    ~CalcFigure(void);
    double CalcSquareFigure();
    double CalcPerimeteFigurer();
    char* GetNameFigure();
private:
     Shape *myShape;    
};

Вот методы класса CalcFigure

#include "CalcFigure.h"
#include "Shape.h"
#include "Triangle.h"
#include "Rectangle.h"
#include "Circle.h"


CalcFigure::CalcFigure(char str[])
{
    int  i;
    char nameOfFigure[255];
    char* strPointer;
    char* space;
    int firstWordLen, otherStringLen;     

    strPointer = str;
    firstWordLen = 0, 
    otherStringLen = 0; 

    for (i = 0; i<10; i++){
       nameOfFigure[i] = ' ';
    }  
    space = strstr(strPointer, ":");
    firstWordLen = space - str;
    otherStringLen = strlen(str) - firstWordLen - 1;
    // Копируем первое слово
    strncpy_s(nameOfFigure, &str[0], firstWordLen);
    nameOfFigure[firstWordLen] = '\0';

    if (strcmp(&nameOfFigure[0],"TRIANGLE") == 0){  
        myShape = new Triangle(&str[0]);       
    }
    if (strcmp(&nameOfFigure[0],"RECTANGLE") == 0){
        myShape = new Rectangle(&str[0]);
    }
    if (strcmp(&nameOfFigure[0],"CIRCLE") == 0){
        myShape = new Circle(&str[0]);
    } 
    myShape -> SetName(&nameOfFigure[0]);   
}


CalcFigure::~CalcFigure(void)
{
}

double CalcFigure:: CalcSquareFigure(){
    return myShape -> CalcSquare();
}
double CalcFigure:: CalcPerimeteFigurer(){
    return myShape -> CalcPerimeter(); 
}
char* CalcFigure:: GetNameFigure(){

    char* nameFigure;
    //nameFigure = myShape -> GetName(); 
    nameFigure = myShape->name; 
    return nameFigure; 
}

Ответы

▲ 1Принят

Ваша проблема в том, что вы выделяете массив на стеке в конструкторе, после чего сохраняете в качестве имени фигуры.

Вот ваша ошибка на самом деле:

CalcFigure::CalcFigure(char str[])
{
  char nameOfFigure[255];
  myShape -> SetName(&nameOfFigure[0]);
  // Указатель-то сохранился, но сам массив сейчас разрушится.
}

Вам следует уделять больше внимания управлению памятью. Я бы посоветовал забыть вообще про char* и использовать std::string. Лучше вообще не использовать "сырые" указатели без крайней необходимости.