C语言中的Strlen()功能问题

时间:2015-10-25 07:57:45

标签: c arrays string sizeof

#include <stdio.h>
int main()
{
char arr[]= {'g', 'e', 'e', 'k', 's'}; 
printf("%d %d", sizeof(arr),strlen(arr));
return 0;
}

我输出为5 6,我无法理解为什么我得到6而不是5因为​​字符数组的长度是5?

4 个答案:

答案 0 :(得分:0)

要获得string的大小,应使用strlen()

strlen()需要\0终止字符串

答案 1 :(得分:0)

guard let device = captureDevice else { print("Device is nil!") return } // Do things with device 结尾的char数组也被视为字符串;因此请注意'\0'的数组大小为arr,而5的数组大小为str,但字符串大小为6str )是strlen

5

即,

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

int main()
{
  char arr[]= {'g', 'e', 'e', 'k', 's'};
  char str[]= {'g', 'e', 'e', 'k', 's', '\0'};

  printf("sizeof arr %d \n", sizeof(arr));
  printf("sizeof str %d \n", sizeof(str));
  printf("strlen str %d \n", strlen(str));

  return 0;
}

答案 2 :(得分:0)

当您编写char arr[] = {'g', 'e', 'e', 'k', 's'};时,您有字符数组,因此sizeof(arr)为您提供arr的长度,以字节为单位,但是当您编写char arr[] = "geeks";时,您将拥有&#39; \ 0&#39;字符自动在arr的末尾,因此arr的大小为6个字节。

答案 3 :(得分:0)

根据C标准(7.1.1术语定义)

  

1字符串是以和结尾的连续字符序列   包括第一个空字符。

  

...字符串的长度是null之前的字节数   字符

函数strlen(7.23.6.3 strlen函数)计算空字符前面的字符数组中的字符数:

  

2 strlen函数计算指向的字符串的长度   第

至于sizeof运算符(6.5.3.4 sizeof和alignof运算符)

  

2 sizeof运算符产生其操作数的大小(以字节为单位)   可以是表达式或类型的带括号的名称。大小是   根据操作数的类型确定。

此声明声明字符数组的大小由初始化程序的数量

决定
char arr[]= {'g', 'e', 'e', 'k', 's'}; 

根据C标准(6.7.9初始化)

  

22如果初始化未知大小的数组,则确定其大小   通过具有显式初始化器的最大索引元素。

所以数组恰好有5个元素。根据{{​​1}}运算符表达式

的定义,其类型为char[5] abd
sizeof

产生其操作数sizeof(arr), 的大小(以字节为单位),即5。

数组不包含空字符。因此,函数arr无法计算空字符前面的字节数。在这种情况下,其行为是未定义的。它将计算数组之外的所有字节,直到它包含空字符。因此表达

strlen

可以产生任何大于5的结果。

您可以使用字符串文字初始化数组,例如

strlen(arr)

在这种情况下,数组也由字符串文字的空字符初始化。此初始化等同于

char arr[]= {"geeks"}; 

在这种情况下,数组的大小

char arr[]= {'g', 'e', 'e', 'k', 's', '\0'};

等于6.并且因为数组具有空字符表达式

sizeof(arr),

将精确计算空字符前面的5个字符。