打印出串联字符串的长度

时间:2014-04-13 18:47:41

标签: c string

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

void main()
{
  char a[8] = "hello";
  char b[8] = "HELLO";

  int x = strcmp(a,b);

   printf("%s \n%s \n", a, b); 

  printf("%s\n", strcat(a,b));
  printf("%d", strlen(strcat(a,b)));
}

打印出来:

  

您好

     

您好

     

helloHELLO

     

12

为什么12?

但如果我有这个:

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

 void main()
 {
  char a[8] = "hello";
  char b[8] = "HELLO";

  int x = strcmp(a,b);

  printf("%s \n%s \n", a, b); 

  //printf("%s\n", strcat(a,b));
  printf("%d", strlen(strcat(a,b)));
}

打印出来:

  

你好

     

你好

     

10

有人可以解释为什么这里的长度不同吗?我觉得这是“\ 0”字符。

1 个答案:

答案 0 :(得分:3)

strcat修改第一个参数指向的字符串。也就是说,第二个参数表示的字符串将附加到第一个参数的字符串中。

您的char a[8] = "hello";是5个字符,加上空值加上两个未使用的字节。然后b在内存中跟随它。

在`strcat:

之前
a:  h e l l o \0 _ _
b:  H E L L O \0 _ _

首先strcat

a:  h  e  l  l  o  H  E  L
b:  L  O  \0 L  O  \0 _  _

现在a已覆盖到bb指向字符串&#34; LO&#34;本质上。

现在第二个strcat正在连接&#34; LO&#34; to&#34; helloHELLO&#34;。在第二个strcat之后:

a:  h  e  l  l  o  H  E  L
b:  L  O  L  O  \0 \0 _  _

请注意第二个a之后strcat处的字符串长度为12个字节:&#34; helloHELLOLO&#34;。

在第二个测试用例中,您删除了第一个strcat,因此您看到了正常输出的内容。但是,当您使用strcat时,必须确保您的接收缓冲区(第一个参数)有足够的空间来容纳整个连接字符串加上null。使用C库函数时,建议您阅读手册页。有关详细信息,请参阅man strcat