关于strcat函数的问题

今天看公司的代码中有一个地方很是不解,大致情况如下:

首先定义一个缓冲区

char KeyBuffer[256];

然后用strcat函数往缓冲区中添加字符

strcat(KeyBuffer, "abcddffgg");

接着看不懂的地方到了

if(strlen(KeyBuffer) > 550)
{
    //操作
}

为什么要判断大于550呢,KeyBuffer只有256字节大小啊?

后来自己写了个小测试程序,如下:

int main(void)
{
    char Str[10];
    memset(Str, 0, sizeof(Str));

    strcat(Str, "aaaaaaaa");
    strcat(Str, "bbbbbb");

}

然后用vs2008调试,跟踪Str的内存情况

1、未初始化时

2、memset清0后

3、第一次strcat连接后

4、第二次strcat连接后

可以清晰的看到第二次strcat连接后,新添加的字符已经超过了KeyBuffer的缓冲区,但是它还是正常连接了,为什么呢?

来看看strcat的源码实现:

char *strat(char *dst, const char *src)
{
    char *cp = dst;
    while(*cp)
        cp++;
    while(*cp++ = *src++);
    return dst;
}

可以看到strcat每次连接后都会将连接字符串的‘\0‘标志也一起连接过来,因此虽然超过了缓冲区的大小,但是字符串实际上已经连接成功了。这个时候如果输出KeyBuffer,可以输出连接后正确的字符串,但是编译器会有一个栈溢出的错误。

其实说了不少,还是不清楚项目中为什么要这样用,可能是没法确定KeyBuffer的大小吧,在使用时将KeyBuffer中的内容拷贝到其它地方或者写入文件,KeyBuffer只是作为一个中转吧

时间: 2024-10-07 11:58:26

关于strcat函数的问题的相关文章

C语言::模拟实现strcat函数

题目要求 编写一个C语言程序模拟实现strcat函数. (我们不妨先模拟实现一下strcat函数,然后再对照一下string.h库函数中strcat函数代码的实现,与大师肩并肩.) 算法分析 strcat函数功能:将两个字符串连接起来,最终返回连接后字符串的首地址. strcat函数原型:char *strcat(char *dest,const char *src); 我们清楚地了解了strcat函数功能和原型之后,就很容易分析出算法... 算法总结 第一步:将dest指向的内容循环遍历至'\

strcat函数造成的段错误(Segmentation fault)

转自:http://book.51cto.com/art/201311/419441.htm 3.21  strcat函数造成的段错误 代码示例 int main() { char dest[7]="12345"; char* src = "abcdefghigklmnopqrstuvwxyz"; strcat(dest, src); cout << "dest:" << dest << endl; retur

strcat函数的坑点

我们先看下面这样一段代码: 1 #include <iostream> 2 #include <stdlib.h> 3 using namespace std; 4 5 int main() 6 { 7 char *p1= "123"; 8 char *p2= "ABC"; 9 char str[50]= "xyz"; 10 strcat(p1,p2); 11 strcpy(str+2,p1); 12 cout<&l

C语言strcat()函数:连接字符串

头文件:#include <string.h> strcat() 函数用来连接字符串,其原型为:    char *strcat(char *dest, const char *src); [参数]dest 为目的字符串指针,src 为源字符串指针. strcat() 会将参数 src 字符串复制到参数 dest 所指的字符串尾部:dest 最后的结束字符 NULL 会被覆盖掉,并在连接后的字符串的尾部再增加一个 NULL. 注意:dest 与 src 所指的内存空间不能重叠,且 dest 要

C语言中模拟实现strcpy,strstr,strcat函数

在C中,要模拟实现这几个库函数,是对指针的传参与函数的调用的考察,代码如下,仅供参考 strcpy函数: #include <assert.h> char* my_strcpy(char* dest, const char* src) { assert(dest);//断言指针的有效性 assert(src); char*pa = dest; while (*dest++ = *src++) ; return pa; } strstr函数: int my_strstr(const char*s

自己实现strcat函数

#include <iostream> using namespace std; // 自己实现strcat函数 void Strcat(char to[], char from[]); int main() { char to[30], from[30]; cout << "请输入第一个字符串:"; cin >> to; cout << "请输入第二个字符串:"; cin >> from; Strcat(

自己实现strcat函数的功能。(假如字符数组足够大)

#include <stdio.h>#include <string.h> /*自己实现strcat函数的功能.(假如字符数组足够大)*/ void main(){ char str1[100] = "helloworld"; char str2[100] = "world"; int i = 0; int index = strlen(str1); for(i = 0; i <= strlen(str2); i++) { str1[i

编写一个程序实现strcat函数的功能

写自己的strcat函数------→mycat 1 #include <stdio.h> 2 #include <string.h> 3 #define N 5 4 5 char *mycat(char *s1, char *s2) 6 { 7 //数组型 8 /* int i = 0; 9 while(s1[i] != '\0') { 10 i++; 11 } 12 int j = 0; 13 while(s2[j] != '\0') { 14 s1[i] = s2[j]; 1

【C语言】模拟实现库函数strcat函数

//模拟实现库函数strcat函数 #include <stdio.h> #include <string.h> #include <assert.h> char * my_strcat(char *dst, const char *src) { char *start = dst; int len_dst = strlen(dst); dst+=len_dst; while (*dst++ = *src++) { ; } return start; } int mai

C 实现strcmp,strcpy,strcat函数

基于C语言的strcmp,strcpy,strcat函数的实现.C语言是一个程序员的基础,一定要重视. char* strcat ( char * dst , const char * src ) { char * cp = dst; while( *cp ) cp++; /* find end of dst */ while( *cp++ = *src++ ) ; /* Copy src to end of dst *///一直到赋完'\0' return( dst ); /* return