C++ strlen() 初始化的char数组
C++ strlen() initialized char array
快速提问。
我找不到为什么初始化的字符数组 return 有这个值。我知道 strlen() 函数只会 return 数组内的字符数量,而不是大小,但为什么会 return 61如果里面没有字符?
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
const int MAX = 50;
char test[MAX];
int length = strlen(test);
cout << "The current \'character\' length of the test array is: " << length << endl;
// returns "61"
// why?
cin >> test; //input == 'nice'
length = strlen(test);
cout << "The new \'character\' length of the test array is: " << length << endl;
// returns 4 when 'nice' is entered.
// this I understand.
return 0;
}
在项目期间这让我抓狂,因为我会尝试使用循环将信息输入字符数组,但 strlen() 总是 return 一个离谱的值,直到我将数组初始化为:
char testArray[50] = '';
而不是
char testArray[50];
我使用 Visual Studio 2015
得到了这些结果
谢谢!
我认为基本的误解是——与其他语言不同——在 C 中,局部定义的变量没有初始化为任何值,既没有空字符串,也没有 0,也没有任何 <undefined>
或其他任何东西除非您明确初始化它们。
注意访问未初始化的变量实际上是"undefined behaviour";它可能会导致 "funny" 和不确定的结果,可能会崩溃,甚至可能会被完全忽略。
此类程序的一个非常常见的行为(虽然显然不能保证!)是,如果您编写
char test[50];
int length = strlen(test);
然后 test
将指向一些内存,该内存以 50
字节的大小保留,但填充了任意字符,不一定是 [=14=]
个字符。因此,从第一个字符是 [=14=]
的意义上说,test
可能不会是 "empty",因为它是真正的空字符串 ""
。如果您现在通过调用 strlen(test)
(如前所述,实际上是 UB)来访问 test
,那么 strlen
可能只是通过这个任意填充的内存,并且它可能会检测到 [=14= ]
在第一个 50
个字符中,或者它可能会在超过 50
字节之后检测到第一个 [=14=]
。
很高兴您找到了答案,但我认为您必须了解这个东西是如何工作的。
char test[MAX];
在这行代码中,您刚刚声明了一个 MAX 字符数组。在初始化它之前,您将在此数组中获得随机值。 strlen 函数只是遍历内存,直到找到 0 值。因此,由于数组中的值是随机的,因此此函数的结果是随机的。此外,您可以轻松走出阵列并获得 UB。
char test[MAX] = '';
此代码用 0 值初始化 'test' 数组中的第一个元素,以便 strlen 能够找到它。
快速提问。
我找不到为什么初始化的字符数组 return 有这个值。我知道 strlen() 函数只会 return 数组内的字符数量,而不是大小,但为什么会 return 61如果里面没有字符?
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
const int MAX = 50;
char test[MAX];
int length = strlen(test);
cout << "The current \'character\' length of the test array is: " << length << endl;
// returns "61"
// why?
cin >> test; //input == 'nice'
length = strlen(test);
cout << "The new \'character\' length of the test array is: " << length << endl;
// returns 4 when 'nice' is entered.
// this I understand.
return 0;
}
在项目期间这让我抓狂,因为我会尝试使用循环将信息输入字符数组,但 strlen() 总是 return 一个离谱的值,直到我将数组初始化为:
char testArray[50] = '';
而不是
char testArray[50];
我使用 Visual Studio 2015
得到了这些结果谢谢!
我认为基本的误解是——与其他语言不同——在 C 中,局部定义的变量没有初始化为任何值,既没有空字符串,也没有 0,也没有任何 <undefined>
或其他任何东西除非您明确初始化它们。
注意访问未初始化的变量实际上是"undefined behaviour";它可能会导致 "funny" 和不确定的结果,可能会崩溃,甚至可能会被完全忽略。
此类程序的一个非常常见的行为(虽然显然不能保证!)是,如果您编写
char test[50];
int length = strlen(test);
然后 test
将指向一些内存,该内存以 50
字节的大小保留,但填充了任意字符,不一定是 [=14=]
个字符。因此,从第一个字符是 [=14=]
的意义上说,test
可能不会是 "empty",因为它是真正的空字符串 ""
。如果您现在通过调用 strlen(test)
(如前所述,实际上是 UB)来访问 test
,那么 strlen
可能只是通过这个任意填充的内存,并且它可能会检测到 [=14= ]
在第一个 50
个字符中,或者它可能会在超过 50
字节之后检测到第一个 [=14=]
。
很高兴您找到了答案,但我认为您必须了解这个东西是如何工作的。
char test[MAX];
在这行代码中,您刚刚声明了一个 MAX 字符数组。在初始化它之前,您将在此数组中获得随机值。 strlen 函数只是遍历内存,直到找到 0 值。因此,由于数组中的值是随机的,因此此函数的结果是随机的。此外,您可以轻松走出阵列并获得 UB。
char test[MAX] = '';
此代码用 0 值初始化 'test' 数组中的第一个元素,以便 strlen 能够找到它。