在C语言中连接字符串

5

如何在C语言中连接字符串,不像1+1=2,而是像1+1=11


很抱歉,您目前的问题不太明确。您能具体说明一下吗? - Mitch Wheat
感谢编辑,Vinko。我本来以为自己的问题会被人喷,但实际上我得到了我想要的答案。谢谢stackoverflow.com。 - austin
Austin,你介意标记一下对你最有帮助的答案吗? - Seh Hui Leong
当然,非常抱歉。这是我第一次使用stackoverflow。 - austin
5个回答

10

我认为你需要字符串拼接:

#include <stdio.h>
#include <string.h>

int main() {
  char str1[50] = "Hello ";
  char str2[] = "World";

  strcat(str1, str2);

  printf("str1: %s\n", str1);

  return 0;
}

来源:http://irc.essex.ac.uk/www.iota-six.co.uk/c/g6_strcat_strncat.asp

strcat()和strncat()函数用于将一个字符串连接到另一个字符串的末尾。

strcat()函数将源字符串的内容复制到目标字符串的末尾,并在目标字符串中添加一个空字符,以终止字符串。

strncat()函数与strcat()函数类似,但是它只将源字符串的前n个字符复制到目标字符串的末尾(不包括源字符串的空字符),并在目标字符串中添加一个空字符,以终止字符串。

这两个函数都需要确保目标字符串具有足够的空间来容纳源字符串,否则可能会导致缓冲区溢出错误。


请注意,strncat(带有“n”)极其难以正确使用 - 因此不要使用它。 - Jonathan Leffler
为什么比起计算 strcat 中的缓冲区更难呢? - Vinko Vrsalovic
2
@Jonathan: 不清楚“非常难”,但更安全。 - Tal Pressman
1
并不是完全安全的。这就是为什么存在strlcat()的原因。尽管这也不是一个完美的解决方案,只是一个即插即用的改进。我会使用snprintf()。它有最好的行为表现。 - Thomas
1
strncat()不能保证结果以空字符结尾。 strlcat()可以保证,但可能不常见。 strcat()完全不知道目标缓冲区的大小。简而言之,C标准库负担了很多历史,这妨碍了防止缓冲区溢出的方法。 - RBerteig
如果我没有使用上面的[50],而只是使用[],代码仍然可以工作。但这是否会导致内存泄漏? - Volomike

7

要连接两个以上的字符串,你可以使用sprintf函数,例如:

char buffer[101];
sprintf(buffer, "%s%s%s%s", "this", " is", " my", " story");

ynimous:snprintf 并非在所有地方都可用。 - Erich Kitzmueller
很多人只能依赖于C89标准,可惜的是他们无法使用sweet snprintf :( - Johannes Schaub - litb

1
'strcat'是答案,但想要有一个明确涉及缓冲区大小问题的示例。
#include <string.h>
#include <stdlib.h>

/* str1 and str2 are the strings that you want to concatenate... */

/* result buffer needs to be one larger than the combined length */
/* of the two strings */
char *result = malloc((strlen(str1) + strlen(str2) + 1));
strcpy(result, str1);
strcat(result, str2);

sizeof(char)始终为1。http://drj11.wordpress.com/2007/04/08/sizeofchar-is-1/ - Vinko Vrsalovic
这段代码通过覆写指针result,导致内存泄漏,并且至少需要使用一个strcpy()。此外,它扩展了str1,但暗示您希望str1和str2都是只读的。 - RBerteig
malloc() 可能会返回 NULL,导致 UB。 - aib

1

尝试查看strcat API。如果有足够的缓冲空间,您可以将一个字符串添加到另一个字符串的末尾。

char[50] buffer;
strcpy(buffer, "1");
printf("%s\n", buffer); // prints 1
strcat(buffer, "1");
printf("%s\n", buffer); // prints 11

strcat 的参考页面


0

strcat(s1, s2)。注意你的缓冲区大小。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接