繁体   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