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

时间:2015-10-29 15:18:13

标签: c arrays string strlen

#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

两个代码之间的区别在于未使用&#34;进入密码[9]&#34;数组,是否应该将密码[8]的字符串长度从8更改为14?

6 个答案:

答案 0 :(得分:9)

strlen期望以null结尾的字符串。你的字符数组缺少空终止符

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

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

答案 1 :(得分:2)

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

char password[] = "abcdefgh";

const char *password = "abcdefgh";

然后在其上调用strlen将为您提供预期的答案。 (或者,如果您受到约束并决心以艰难的方式去做,请使用

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

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

答案 2 :(得分:1)

您的程序已调用 未定义的行为 ,因此,可能的解释是任何内容都可以显示为输出(如果幸运的话,您会遇到段错误)。

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

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

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

写 -

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

char password[]="abcdefgh";

答案 3 :(得分:0)

函数strlen()将与字符串一起使用。在C字符串中是由\0终止的字符数组。但是您的数组不会NULL \0终止。

尝试以下

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

char mystr[100]="test string";

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

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

在这种情况下,您的密码字符串以空值终止,而strlen()将返回正确答案。