Ваш 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;
}