嘿所以我试图让pdCurses中的addstr()使用首选的字符串类来工作(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;
}
答案 0 :(得分:2)
你的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;
}
答案 1 :(得分:0)
一个问题是你在string_to_80char()中返回一个指向存储在堆栈中的变量的指针。该变量存储在堆栈中:
char charArray[90];
当您从该函数返回时,此变量使用的存储不再有效,并且可能会重复使用。 addtr()的堆栈变量可能会覆盖同一个存储,因此你的字符串被破坏了。
一个简单的解决方法是使charArray静态,因此它不会在堆栈上分配:
static char charArray[90];
答案 2 :(得分:0)
addstr(mesg[0].c_str())
应该是您所需要的一切。 PDCurses是一个C库,所以需要C字符串。它们不必是80列或其他任何特殊的列。
或者,制作一个简单的C ++包装函数:
int my_addstr(const string &aString)
{
return addstr(aString.c_str());
}