【问题标题】:Using sizeof with char *array[]将 sizeof 与 char *array[] 一起使用
【发布时间】:2015-05-30 20:32:33
【问题描述】:

我是编程新手。现在我正在学习CJava

我有一个这样的数组 -

char *array = {"zero", "one", "two", "three"};  

从这个link我可以像这样打印数组内容 -

printf("%s %s", array[0], array[1]); //zero one  

但我的问题是如何打印array[0]array[1] 等引用的长度。我知道我可以做这样的事情 -

printf("%d\n", sizeof("zero");  

但是我可以使用array 变量本身打印尺寸吗?

我尝试过不同的方法,比如 -

printf("%d\n", sizeof(array[0]);  //4
printf("%d\n", sizeof(*array[0]);  //1

但每次我得到错误的答案。

谢谢

【问题讨论】:

  • C - SizeOf Pointers 的可能重复项
  • 顺便说一句,char *array = {}; 声明没有声明char 指针数组,或者在这种情况下为字符串,它应该是char *array[] = {"zero", ... }
  • 我不是在寻找 sizeof 指针。我正在寻找指针所引用的字符串长度。可能我在尺寸和长度之间搞砸了。这就是混乱发生的原因。

标签: c arrays


【解决方案1】:

数组的每个元素的大小都是一样的,因为数组被声明为一个指针数组

char * array[] = {"zero", "one", "two", "three"};  
^^^^^^

(注意你必须使用记录数组[])

即数组的每个元素的类型为char *,相应地,在您运行程序的环境中,它的大小等于4。

实际上,您想要获取数组元素所指向的字符串字面量的大小。为此,您可以使用在标头 <string.h> 中声明的标准 C 函数 strlen 该函数将返回字符串文字中不超过终止零字符的字符数。

printf( "%zu\n", strlen( array[0] ) ); // returns 4 for "zero"
printf( "%zu\n", strlen( array[1] ) ); // returns 3 for "one"

【讨论】:

    【解决方案2】:

    你需要strlen

    printf("%d\n", (int) strlen(array[0]));
    

    【讨论】:

    • 为什么投反对票。这是 OP 提出的问题的正确答案
    • @user3629249 array[0] 的类型为char
    • 哦!谢谢我正在找这个。可能我的问题令人困惑。但你理解我的要求。
    【解决方案3】:
    1. 首先,如果你想声明一个char * 的数组,即char 指针,指向字符串字面量,那么缺少两个东西,[]const,因为你不想不小心修改那个,所以

      const char *array[] = {"zero", "one", "two", "three"};
      

      应该是正确的方法。

    2. 原因是nul终结符,在

      printf("%zu\n", sizeof(array[0]))
      

      正确的值是5而不是4,因为"zero"使用5字节"zero\0"而不是4,最后一个是nul终止符,它标志着c字符串的结束。

      如果您的字符串非常简单且规则,那么sizeof(array[0]) - 1 将给出正确的值,尽管它不是一个可靠的解决方案,因为它假定字符串是像"zero" 这样的简单字符串,如果字符串会失败已嵌入'\0' 字节,例如"zero\0one\0",这是一个有效的字符串文字,sizeof 将为此提供10

      在c中获取字符串长度的正确方法是遍历字节直到出现'\0',这就是strlen()所做的,所以你可以非常小心地使用strlen(),因为它可能一不小心就很容易失败,而且

      printf("%zu\n", strlen("zero\0one\0"));
      

      将返回4,因为'\0' 的第一次出现足以让函数返回。

      由于同样的原因,printf("%s\n", "zero\0one\0"); 也会输出 zero

      strlen() 最危险的事情是传递一个非nul 终止的序列,这会导致未定义的行为,使用字符串字面量根本没有危险,但是如果你定义一个数组并手动填充字符,真的很容易忘记加上终止符'\0',用strlen()也没那么难。

    【讨论】:

    • sizeof(array[0])sizeof(char*),与字符串内容无关。
    • 糟糕,我没有看到变量被声明为char *
    猜你喜欢
    • 1970-01-01
    • 2015-08-14
    • 1970-01-01
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    • 2017-07-09
    • 1970-01-01
    相关资源
    最近更新 更多