gpt4 book ai didi

c - 如何使用strcat()函数?

转载 作者:行者123 更新时间:2023-11-30 16:10:43 24 4
gpt4 key购买 nike

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

#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;
}


这个正常运行,但是

#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函数中返回不同的结果。提前致谢。

最佳答案

在C中,函数strcat不会创建包含串联字符串的新字符数组。只要它有足够的元素来存储新字符,它将第二个字符串中的字符追加到第一个字符数组的第一个字符串中。否则,该函数将尝试覆盖超出字符数组的内存,从而导致未定义的行为。

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

#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不确定这些数组是否是唯一的,只要它们
  元素具有适当的值。如果程序尝试执行
  修改这样的数组,行为是不确定的。


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

#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)或动态分配数组,则可以使用它。例如

#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;
}


要么

#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;
}

关于c - 如何使用strcat()函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58815475/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com