strlen的奇怪行为

时间:2013-03-21 05:06:02

标签: c++

我在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

请告诉我这种奇怪行为的原因......

3 个答案:

答案 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;
}