c语⾔快速拼接字符串,C语⾔拼接字符串
字符串拼接涉及两个字符串的合并。strcat函数经常⽤来执⾏这种操作,这个函数接受两个字符串指针作为参数,然后把两者拼接起来并返回拼接结果的指针。这个函数的原型如下:
此函数把第⼆个字符串拼接到第⼀个的结尾,第⼆个字符串是以常量char指针的形式传递的。函数不会分配内存,这意味着第⼀个字符串必须⾜够长,能容纳拼接后的结果,否则函数可能会越界写⼊,导致不可预期的⾏为。函数的返回值的地址跟第⼀个参数的地址⼀样。这在某些情况下⽐较⽅便,⽐如这个函数作为printf函数的参数时。
为了说明这个函数的⽤法,我们会组合两个错误消息字符串。第⼀个是前缀,第⼆个是具体的错误消息。如下所⽰,我们⾸先在缓冲区中为两个字符串分配⾜够的内存,然后把第⼀个字符串复制到缓冲区,最后将第⼆个字符串和缓冲区拼接:
我们给malloc函数的参数加1是为了容纳NUL字符。假设第⼀个字⾯量在内存中的位置就在第⼆个字⾯量前⾯,这段代码的输出会像下⾯这样。下图说明了内存分配情况。
如果我们没有为拼接后的字符串分配独⽴的内存,就可能会覆写第⼆个字符串,下⾯这个没有⽤到缓冲区的例⼦会说明这⼀点。我们仍然假设第⼀个字⾯量在内存中的位置就在第⼆个字⾯量前⾯:
这段代码的输出如下:
errorMessage字符串会左移⼀个字符,原因是拼接后的结果覆写了errorMessage。字⾯量"Not enough memory"紧跟在第⼀个字⾯量之后,因此覆写了第⼆个字⾯量。下图解释了这⼀点,字⾯量池的状态显⽰在左边,右边是复制操作后的状态。
如果我们像下⾯这样⽤char数组⽽不是⽤指针来存储字符串,就不⼀定能⼯作了:
如果⽤下⾯这个strcpy调⽤会得到⼀个语法错误,这是因为我们试图把函数返回的指针赋给数组名字,这类操作不合法:
如果像下⾯这样去掉赋值,就可能会有内存访问的漏洞,因为复制操作会覆写栈帧的⼀部分。这⾥假设在函数内部声明数组,如图5-11所⽰。⽆论源字符串是存储在字符串字⾯量池中还是栈帧中,都不应该⽤来直接存放拼接后的结果,⼀定要专门为拼接结果分配内存:
拼接字符串时容易犯错的另⼀个地⽅是使⽤字符字⾯量⽽不是字符串字⾯量。在下例中,我们将⼀个字符串拼接到⼀个路径字符串后,这样是能如期⼯作的:
molloc函数因为额外的字符和NUL字符需要空间,我们在malloc调⽤中给字符串长度加了2。因为在字符串字⾯量
中⽤了转义序列,所以这⾥拼接的是⼀个反斜杠字符。
不过,如果使⽤字符字⾯量,如下所⽰,那么就会得到⼀个运⾏时错误,原因是第⼆个参数被错误地解释为char类型变量的地址1:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论