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 给出正确答案。
#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 给出正确答案。