#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?
答案 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()将返回正确答案。