2

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

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

4

3 回答 3

12

这里没有奇怪的行为。您的字符串不是以 nul 结尾的,因此该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 字符。您可以将其设为字符串(双引号导致编译器自动附加 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 的字节。

于 2013-03-21T05:07:50.307 回答
8

strlen只能用于字符串,不能用于任意字符数组。

strlen() 函数应计算s 指向的字符串中的字节数,不包括终止的空字节。-- IEEE1003

C++ 标准说strlenC++ 与 C 中的相同strlen。C 标准说:

该函数计算s指向的字符串strlen的长度。-- C99 7.21.6.3

和:

字符串是由第一个空字符终止并包括第一个空字符的连续字符序列。-- C99 7.1.1

因此,您必须确保传递给strlen的内容实际上是一个字符串,而不仅仅是一个字符数组。

于 2013-03-21T05:08:16.283 回答
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;
}
于 2013-07-29T15:04:38.690 回答