我在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;
}
Run Code Online (Sandbox Code Playgroud)
在ideone上运行时上面程序的输出是
lenv = 26 and lenc = 21
Run Code Online (Sandbox Code Playgroud)
当使用codeblocks在Windows上运行时
lenv = 5 and lenc = 26
Run Code Online (Sandbox Code Playgroud)
请告诉我这种奇怪行为的原因......
Fat*_*ror 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'};
Run Code Online (Sandbox Code Playgroud)
没有添加nul char.您可以将其设为字符串(双引号会导致编译器自动附加nul终止符):
char consonant[] = "bcd...z";
Run Code Online (Sandbox Code Playgroud)
或者您可以在数组的末尾显式包含它:
char consonant[] = {'b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'q', 'r', 's', 't', 'v', 'w', 'x', 'y', 'z', '\0'};
Run Code Online (Sandbox Code Playgroud)
否则,strlen()将很乐意读取数组的末尾,直到它在内存中找到一个值为0的字节.
strlen 只能在字符串上使用,而不能在任意字符数组中使用.
strlen()函数应计算s指向的字符串中的字节数,不包括终止空字节. - IEEE1003
C++标准说strlenC++与C中的相同strlen.C标准说:
该
strlen函数计算s指向的字符串的长度. - C99 7.21.6.3
和:
甲串是由封端的字符的连续序列,并且包括第一个空字符. - C99 7.1.1
因此,您必须确保传递给它的任何内容strlen实际上都是一个字符串,而不仅仅是一个字符数组.
| 归档时间: |
|
| 查看次数: |
360 次 |
| 最近记录: |