首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用strcat()函数?

如何使用strcat()函数?
EN

Stack Overflow用户
提问于 2017-07-28 14:04:35
回答 2查看 2.8K关注 0票数 2

我是C语言的新手。我试着使用strcat函数。

代码语言:javascript
复制
#include <stdio.h>
#include <string.h>

int main(int argc, const char *argv[]) {
    char s1[] = "12345";
    char s2[] = "abcde";

    strcat(s1, s2);

    puts(s1);
    puts(s2);
    return 0;
}

这个正常运行,但是

代码语言:javascript
复制
#include <stdio.h>
#include <string.h>

int main(int argc, const char *argv[]) {
    char* s1 = "12345";
    char* s2 = "abcde";

    strcat(s1, s2);

    puts(s1);
    puts(s2);
    return 0;
}

最后一次没有返回结果。为什么两种不同的声明方式在strcat函数中返回不同的结果。提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-28 14:17:37

在C中,函数strcat不创建包含连接字符串的新字符数组。它将第二个字符串中的字符附加到第一个字符数组的第一个字符串中,条件是它有足够的元素来存储新字符。否则,函数将试图覆盖字符数组之外的内存,从而导致未定义的行为。

因此,在第一个程序中有效地使用该函数可以如下所示

代码语言:javascript
复制
#include <stdio.h>
#include <string.h>

int main(int argc, const char *argv[]) {
    char s1[11] = "12345";
    char s2[] = "abcde";

    strcat(s1, s2);

    puts(s1);
    puts(s2);
    return 0;
} 

在这个程序中,字符数组被声明为有11个元素。因此,它能够容纳附加的字符串"abcde"

在第二个程序中,有人试图修改指针s1指向的字符串文字。C和C++中的字符串文本是不可变的。任何更改字符串文字的尝试都会导致未定义的行为,即使在C中与C++字符串文本相反,也有类型的非常数字符数组。

来自C标准(6.4.5字符串文本)

7如果这些数组的元素具有适当的值,则这些数组是否是不同的。如果程序试图修改这样的数组,则行为是未定义的.。

因此,在第二个程序中,您再次需要使用一个具有足够元素的字符数组。例如

代码语言:javascript
复制
#include <stdio.h>
#include <string.h>

int main(int argc, const char *argv[]) {
    char s1[11] = "12345";
    char* s2 = "abcde";

    strcat(s1, s2);

    puts(s1);
    puts(s2);
    return 0;
}

或者,如果编译器支持变量长度数组(VLA),或者动态分配数组。例如

代码语言:javascript
复制
#include <stdio.h>
#include <string.h>

int main(int argc, const char *argv[]) {
    char *s1 = "12345";
    char* s2 = "abcde";
    char s3[strlen( s1 ) + strlen( s2 ) + 1];    

    strcpy( s3, s1 );
    strcat( s3, s2 );

    puts(s1);
    puts(s2);
    puts(s3);

    return 0;
}

代码语言:javascript
复制
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, const char *argv[]) {
    char *s1 = "12345";
    char* s2 = "abcde";
    char *s3 = malloc( strlen( s1 ) + strlen( s2 ) + 1 );    

    if ( s3 != NULL )
    {
        strcpy( s3, s1 );
        strcat( s3, s2 );

        puts(s1);
        puts(s2);
        puts(s3);
    }

    free( s3 );

    return 0;
}
票数 6
EN

Stack Overflow用户

发布于 2017-07-28 14:07:18

这两个代码片段都调用未定义的行为。在第一个片段中,s1没有足够的空间容纳除6个字符以外的任何其他字符。

在第二个片段中,您正在尝试修改字符串文本。任何修改字符串文字的尝试都会导致未定义的行为。

阅读 man page

..。字符串可能不重叠,dest 字符串必须有足够的空间来处理结果。如果dest 不够大,程序行为是不可预测的;缓冲区溢出是攻击安全程序的首选方法。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45375524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档