c - 关于字符串长度,终止NUL等

标签 c string arrays

我目前正在学习 C,我对字符数组和字符串之间的差异以及它们的工作方式感到困惑。

问题 1:

为什么源码1和源码2的结果不一样?

源代码1:

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

int main(void)
{
    char c[2]="Hi";
    printf("%d\n", strlen(c));   //returns 3 (not 2!?)
    return 0;
}

源代码2:

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

int main(void)
{
    char c[3]="Hi";
    printf("%d\n", strlen(c));   //returns 2 (not 3!?)
    return 0;
}

问题 2:

字符串变量与字符数组有何不同?如何用允许存储\0 的最小索引号来声明它们(请阅读下面的代码)?

char name[index] = "Mick";   //should index be 4 or 5?

char name[index] = {'M', 'i', 'c', 'k'};   //should index be 4 or 5?

#define name "Mick"   //what is the size? Is there a \0?

问题 3:

终止 NUL 是否只跟在字符串后面而不跟在字符数组后面?那么字符串“Hi”的实际值是[H][i][\0],字符数组“Hi”的实际值是[H][i]?

问题 4:

假设 c[2] 将存储“Hi”后跟一个\0(不确定这是如何完成的,也许使用 gets(c)?)。那么\0 存储在哪里呢?它是存储在 c[2] 之后的“某处”成为 [H][i]\0 还是 c[2] 附加\0 成为 c[3] 即 [H][i][\0 ]?

令人困惑的是,有时字符串/字符数组后面有一个\0,当我通过 if (c1==c2) 比较两个变量时会造成麻烦,因为它很可能返回 FALSE ( 0).

感谢详细的答案。但是保持简短的回答有助于我的理解 :) 提前致谢!

最佳答案

答案 1:在代码 1 中,您有一个不是字符串的 char 数组;在代码 2 中,您有一个 char 数组,它也是一个字符串。

答案 2:字符串是一个字符数组,其中(至少)一个元素的值为 0;如果将大小部分留空,编译器将自动用可能的最小值填充它。

char astring[] = "foobar"; /* compiler automagically uses 7 for size */
printf("%d\n", (int)sizeof astring);

答案3:其中一个元素为NUL的char数组是字符串;没有元素为 NUL 的 char 数组不是字符串。

答案 4:定义为包含两个元素的数组 (char c[2];) 不能包含三个元素。如果它是一个字符串,它只能是空字符串或一个包含 1 个字符的字符串。

关于c - 关于字符串长度,终止NUL等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56419611/

相关文章:

c - C中 union 变量的操作

C# Double - ToString() 格式化为两位小数但没有舍入

python - Python 如何在没有 %s 的情况下进行字符串替换?

c - 具有二维数组 malloc 的结构

javascript - 在 javascript 函数中使用数组元素的值不起作用

c - 简单哈希表中的段错误

c - 在 C 中的单独函数中初始化指针

c++ - 在 C++ 中通过引用和值传递字符串

java - Java中的数组常量初始化

c - 为什么 char* 数据类型的大小对应于计算机的字大小(4 字节或 8 字节),而 char 仅获取 1 字节?