簡體   English   中英

C字符串連接問題功能

[英]C String concatenation issue function

我有點需要做一些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()函數:

這里的問題是,當我到達第二個循環時,由於內存讀取違規,程序在第二次迭代時崩潰。 為什么會這樣,我不確定。

調用代碼如下所示:

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 ++作為編譯器。

有誰知道這里的問題是什么?

你的優先權是錯的,

tmp[ counter++ ] = *dest[ iDest ];

是(隱含地)parethesised

tmp[ counter++ ] = *(dest[ iDest ]);

但你需要

tmp[ counter++ ] = (*dest)[ iDest ];

用明確的括號。

如果沒有括號,在*dest之后的iDest * sizeof(char*)字節的偏移處的(假定的) char*被取消引用,可能沒有允許取消引用的有效char* 您希望在*dest指向的位置之后以iDest字節的偏移量訪問該字節。

在末尾,

strncpy( *dest, tmp, total_len );

不會終止連接的字符串。 那里你需要totalLenNull

在旁邊:

return strnlen( string, strlen( string ) );

相當謹慎。 首先,遍歷string以查找終止的0字節,在此之前計算char 然后,你檢查是否有第一之間的終止0字節strlen(string)的字節string 除非在這兩個調用之間修改string (然后你可能已經被軟化),否則第二個將返回與第一個調用完全相同的string

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM