Я как бы в ситуации, когда мне нужно сделать некоторую конкатенацию C-String, поэтому я решил взять на себя обучение (это всего лишь личный проект, поэтому у меня есть все время в мире, на самом деле).
До сих пор я придумал эти две функции (объяснение приведено ниже):
static inline // make inline to leave out the stack manipulation
size_t StrLength( const char* string )
{
return strnlen( string, strlen( string ) );
}
static void concatstr( char** dest, const char** src )
{
const size_t destlen = StrLength( *dest );
const size_t srclen = StrLength( *src );
const size_t total_len = destlen + srclen;
const size_t totalLenNull = total_len + 1;
char* tmp = ( char* )malloc( sizeof( char ) * totalLenNull ); //<-- Because of this...
size_t counter = 0;
for( size_t iDest = 0; iDest < destlen; ++iDest )
tmp[ counter++ ] = *dest[ iDest ];
for ( size_t iSrc = 0; iSrc < srclen; ++iSrc )
tmp[ counter++ ] = *src[ iSrc ];
*dest = ( char* ) realloc( *dest, totalLenNull );
strncpy( *dest, tmp, total_len );
free( tmp );
tmp = NULL;
}
Идея встроенной функции StrLength заключается в том, что, если я правильно понимаю встроенную функцию, она должна работать как более безопасный макрос в C++, поэтому она менее подвержена ошибкам (я думаю). Я сделал его встроенным, так как это всего лишь одна строка кода, и манипулирование стеком для такого рода процесса кажется слишком сложным. Однако, если я ошибаюсь, поправьте меня в этом.
Теперь о функции concatstr()
:
Проблема здесь в том, что как только я дохожу до второго цикла, программа падает на 2-й итерации из-за нарушения чтения памяти. Почему это происходит, я не уверен.
Код вызова выглядит следующим образом:
const size_t len = StrLength( msg ) + mPrefix.length() + StrLength( "\n\n" );
char* out = ( char* )malloc( sizeof( char ) * ( len + 1 ) );
out[0] = '\0';
const char* tmp_pass = mPrefix.c_str();
concatstr( &out, &tmp_pass );
concatstr( &out, &msg );
Единственная причина, по которой я помещаю здесь тег visual-C++, заключается в том, что, хотя я делаю это так же, как в прямом C, я использую VC++ в качестве компилятора.
Кто-нибудь знает, в чем здесь проблема?
StrLength()
; особенно после прочтения кода этой функции; используйтеstrlen()
напрямую. См. en.cppreference.com/w/cpp/language/operator_precedence.[]
имеет приоритет над*
, и вы используете его в двух местах. - person foxx1337   schedule 02.12.2012