Проклинает проблемы со строками и символами

Итак, я пытаюсь заставить addstr() в библиотеке pdCurses работать (windows curses) с предпочтительным строковым классом, поэтому я сделал функцию следующей функцией string_to_80char(), которая должна принимать строку и возвращать 80 символов. длинный массив символов (количество символов, умещающееся в одной строке в консоли), поскольку это единственный параметр, который addstr принимает...

Однако при запуске следующего кода я печатаю «Просто строку», но со случайным символом, например «@» или «4», например, через 50 пробелов после него.....

В ЧЕМ ПРОБЛЕМА?? Спасибо за помощь! знак равно

#include <curses.h>         /* ncurses.h includes stdio.h */  
#include <string> 
#include <vector>
#include <Windows.h>
#include <iostream>
using namespace std;

char* string_to_80char (const string& aString)
{
    int stringSize = aString.size();
    char charArray[90];

    if(stringSize <= 80)
    {
    for(int I = 0; I< stringSize; I++)
        charArray[I] = aString[I];
    for(int I = stringSize; I < sizeof(charArray); I++)
        charArray [I] = ' ';
    return charArray;
    }

    else
    {
    char error[] = {"STRING TOO LONG"};
    return error;
    }
};


int main()
{
    //   A bunch of Curses API set up:
    WINDOW *wnd;

 wnd = initscr(); // curses call to initialize window and curses mode
 cbreak(); // curses call to set no waiting for Enter key
 noecho(); // curses call to set no echoing

 std::string mesg[]= {"Just a string"};     /* message to be appeared on the screen */
 int row,col;               /* to store the number of rows and *
                     * the number of colums of the screen */
 getmaxyx(stdscr,row,col);      /* get the number of rows and columns */
 clear(); // curses call to clear screen, send cursor to position (0,0)

 string test = string_to_80char(mesg[0]);
 char* test2 = string_to_80char(mesg[0]);
 int test3 = test.size();
 int test4 = test.length();
 int test5 = sizeof(test2);
 int test6 = sizeof(test);

 addstr(string_to_80char(mesg[0]));
 refresh();
 getch();


 cout << endl << "Try resizing your window(if possible) and then run this program again";
  system("PAUSE");
 refresh();
  system("PAUSE");

 endwin();
 return 0;
}

person Griffin    schedule 08.05.2011    source источник
comment
возможный дубликат pdCURSES и проблемы совместимости addstr со строками   -  person casperOne    schedule 09.05.2011


Ответы (1)


Вы объявляете charArray внутри функции, а затем возвращаете на нее указатель. Вне функции эта память выходит за рамки, и на нее не следует ссылаться.

char* string_to_80char (const string& aString)
{
  ...
  char charArray[90];
  ...
  return charArray
}

То же самое и со строкой ошибки.
Вы можете передать charArray в string_to_80char и написать туда.

void string_to_80char (const string& aString, char charArray[])

Конечно, могут быть и другие проблемы.

person Philip    schedule 14.07.2011