我目前正在学习 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/