Совместимость pdCURSES и addstr с проблемами строк - PullRequest
0 голосов
/ 08 мая 2011

Эй, я пытаюсь заставить 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;
}

Ответы [ 3 ]

2 голосов
/ 09 мая 2011

Ваш string_to_80char() возвращает указатель на локальную переменную, и время жизни этой переменной заканчивается, когда функция возвращается, поэтому указатель указывает на мусор.Кроме того, вы не ставите символ '\0' в конце возвращаемой строки (но это помимо того, что возвращаемое вами сообщение официально не существует в любом случае).

Пусть вызывающая сторона предоставитбуфер для помещения строки 80 char в (непроверенный пример):

char* string_to_80char (const string& aString, char* buf, size_t bufSize)
{
    int stringSize = aString.size();
    enum {
        max_buf_size = 81;  /* 80 plus the '\0' terminator */
    };

    bufSize = (bufSize < max_buf_size) ? bufSize : max_buf_size; 

    if (stringSize+1 < bufSize) {
        return NULL;  /* or however you want to handle the error */
    }

    /* we know the buffer is large enough, so strcpy() is safe */
    strcpy( buf, aString.c_str());

    return buf;
};

В качестве альтернативы, выделите возвращенный буфер в куче и верните его (в этом случае вызывающая сторона должна освободить буфер, когда онис этим покончено).

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

    if(stringSize <= 80)
    {
        return strdup(aString.c_str());
    }

    return strdup("STRING TOO LONG");
};

Если вы работаете в Windows и у вас нет strdup(), вот вам:

#include <stdlib.h>
#include <string.h>
#include <assert.h>

/* 
 * public domain strdup()
 */

char* strdup( char const* s)
{
   size_t siz = 0;
   char* result = NULL;
   assert( s);

   siz = strlen( s) + 1;
   result = (char*) malloc( siz);

   if (result) {
       memcpy( result, s, siz);
   }

   return result;
}
0 голосов
/ 02 марта 2014
addstr(mesg[0].c_str())

должно быть все, что вам нужно. PDCurses - это библиотека C, поэтому она принимает строки C. Они не должны быть 80 столбцами или чем-то еще особенным.

Либо создайте простую функцию-оболочку C ++:

int my_addstr(const string &aString)
{
    return addstr(aString.c_str());
}
0 голосов
/ 16 мая 2011

Одной из проблем является то, что вы возвращаете указатель на переменную, хранящуюся в стеке в string_to_80char (). Эта переменная хранится в стеке:

char charArray[90];

Когда вы возвращаетесь из этой функции, хранилище, используемое этой переменной, больше не является допустимым и, вероятно, будет использовано повторно. Вероятно, переменные стека addstr () перезаписывают это же хранилище, поэтому ваша строка повреждена.

Простое исправление состоит в том, чтобы сделать charArray статическим, чтобы он не размещался в стеке:

static char charArray[90];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...