我在C ++中创建了一个程序,其中我使用了两个char数组,我在声明时初始化,当我使用strlen()
函数计算它们的长度时,我得到了奇怪的输出。代码如下所示
#include<stdio.h>
#include<string.h>
#include<string>
using namespace std;
char consonant[] = {'b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'q', 'r', 's', 't', 'v', 'w', 'x', 'y', 'z'};
char vowel[] = {'a', 'e', 'i', 'o', 'u'};
int main()
{
int lenv, lenc;
lenc = strlen(consonant);
lenv = strlen(vowel);
printf("lenv = %d and lenc = %d\n", lenv, lenc);
return 0;
}
在ideone上运行时上述程序的输出是
lenv = 26 and lenc = 21
当使用代码块在Windows上运行时
lenv = 5 and lenc = 26
请告诉我这种奇怪行为的原因......
答案 0 :(得分:12)
这里没有奇怪的举动。您的字符串不是以字符结尾的,因此strlen()
函数无法识别它们的结束位置。
初始化字符串时如下:
char consonant[] = {'b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'q', 'r', 's', 't', 'v', 'w', 'x', 'y', 'z'};
没有添加nul char。你可以使它成为一个字符串(双引号使编译器自动附加nul终止符):
char consonant[] = "bcd...z";
或者您可以在数组的末尾显式包含它:
char consonant[] = {'b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'q', 'r', 's', 't', 'v', 'w', 'x', 'y', 'z', '\0'};
否则,strlen()
将很乐意读出数组的末尾,直到它在内存中找到一个值为0的字节。
答案 1 :(得分:8)
strlen
只能用于字符串而不能用于任意字符数组。
strlen()函数应计算s指向的字符串中的字节数,不包括终止空字节。 - IEEE1003
C ++标准说strlen
是C ++与C中的strlen
相同.C标准说:
strlen
函数计算 s 指向的字符串的长度。 - C99 7.21.6.3
和
string 是由第一个null终止并包含第一个null的连续字符序列 字符。 - C99 7.1.1
因此,您必须确保传递给strlen
的任何内容实际上都是字符串,而不仅仅是一个字符数组。
答案 2 :(得分:1)
其他答案已经注意到你应该用'\ 0'关闭你的c风格的字符串,你的lenc=21
最有可能出现一些溢出现象(它可以是n * SIZE_MAX + 21,任何n .. )。
在c:
中专注于如何正确解决问题#include<string.h>
#include<stdio.h>
char consonant[] = "abcdefghijklmnopqrstuvxyz"; /* this is automatically '\0' terminated */
char vowel[] = "aeiou";
int main()
{
int lenv, lenc;
lenc = strlen(consonant);
lenv = strlen(vowel);
printf("lenv = %d and lenc = %d\n", lenv, lenc);
return 0;
}
请注意,using namespace std
仅限c ++。
另一方面正确的c ++解决方案如下所示:
#include<string>
#include<iostream>
std::string consonant("abcdefghijklmnopqrstuvxyz");
std::string vowel("aeiou");
int main()
{
using namespace std; // if you wish using it, put it into a function
int lenc = consonant.size();
int lenv = vowel.size();
cout << "lenv = " << lenc << " and " << "lenc = " << lenc << endl;
return 0;
}