C编程奇怪的输出,我做错了什么?

C programming strange output, what did I do wrong?

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

int main()
{
 int j;
 char password[8] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'};
 j = strlen(password);
 printf("Size = %d\n", j);
 return 0;
}

输出: 尺寸 = 8

但是这段代码

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

int main()
{
 int j;
 char password[8] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'};
 char enteredpassword[9];
 j = strlen(password);
 printf("Size = %d\n", j);
 return 0;
}

输出: 尺寸 = 14

两个代码的区别在于未使用的"enteredpassword[9]"数组,是否应该将password[8]的字符串长度从8更改为14?

strlen 需要一个以 null 结尾的字符串。您的字符数组缺少空终止符

char password[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', '[=10=]'};
//           ^^                                            ^^^^
j = strlen(password);

在非空终止的字符串上调用 strlen 未定义的行为 ,这意味着您的程序可能会崩溃或 return 不可预测的结果。请注意更改如何删除 password 数组的硬编码长度,让编译器计算出正确的大小。

你的程序调用了未定义的行为,因此,可能的解释是任何东西都可以作为输出出现(如果幸运的话你遇到段错误).

char password[8] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'};   //not a C-style string 

password 不是以 null 结尾的字符串,将其传递给 strlen 将导致 UB.

j = strlen(password);   //will invoke UB

要么写-

char password[9] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h','[=12=]'};

char password[]="abcdefgh";

函数strlen()将与字符串一起使用。在 C 中,字符串是以 [=13=] 结尾的字符数组。但是你的数组没有 NULL [=13=] 终止。

尝试以下方法

char password[9] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', '[=10=]'};

您的代码有未定义的行为,因为您调用 strlen() 的字符数组不是以 0 正确终止的,即它们不是字符串。

您的 password 不是以 null 结尾的字符串。如果按常规初始化:

char password[] = "abcdefgh";

const char *password = "abcdefgh";

然后调用 strlen 会给你预期的答案。 (或者,如果您受限并决心以艰难的方式做到这一点,请使用

char password[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', '[=12=]'};

char password[9] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', '[=13=]'};

.)

在 C 中初始化字符串的正常方法是这样的:

char mystr[100]="test string";

因为每个字符串都以 NULL 字符 ('\0') 结尾,所以您必须像下面这样初始化您的字符串:

char password[8] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', '[=11=]'};

在这种情况下,您的密码字符串以 null 结尾,strlen() 将 return 给出正确答案。