繁体   English   中英

输出错误的错误

[英]Wrong strlen output

我在C中有以下代码:

char a[55] = "hello";
size_t length = strlen(a);
char b[length];
strncpy(b,a,length);
size_t length2 = strlen(b);
printf("%d\n", length);          // output = 5
printf("%d\n", length2);         // output = 8

为什么会这样呢?

必须为'b [length +1]'。strlen在c字符串的末尾不包含空字符。

您从未将b初始化为任何东西。 因此,它的内容是不确定的。 调用strlen(b)可能会超出b的大小,并导致未定义的行为(例如崩溃)。

b未初始化:运行程序时,它包含RAM中的所有内容。

对于第一个字符串a,长度为5,因为它应该是“ hello”,具有5个字符。

对于第二个字符串,b会将其声明为5个字符的字符串,但不对其进行初始化,因此它将对字符进行计数,直到找到包含0终止符的字节为止。

UPDATE :在我写原始答案后添加了以下行。

strncpy(b,a,length);

在添加之后,问题在于您声明了b的长度,而为字符串终止符提供空间时,它应该为length + 1。

其他人已经指出,您需要为b分配strlen(a)+1字符,才能容纳整个字符串。

他们为您提供了一组用于strncpy的参数,这些参数将(试图)掩盖一个事实,即它并不真正适合手头的工作(或者说实话,几乎所有其他工作)。 您真正想要的只是使用strcpy代替。 但是还要注意,在分配它时, b也是一个本地( auto存储类)变量。 将字符串复制到局部变量中很少有用。

在大多数情况下,如果要复制字符串,则需要将其复制到动态分配的存储中-否则,您最好使用原始字符串,而根本不进行复制。 将字符串复制到动态分配的存储中已经足够普遍了,以至于许多库已经为此包含了一个函数(通常称为strdup )。 如果您的图书馆没有这个库,那么编写自己的库就很容易了:

char *dupstr(char const *input) {
    char *ret = malloc(strlen(input)+1);
    if (ret)
        strcpy(ret, input);
    return ret;
}

[编辑:我将其命名为dupstr因为strdup (以及其他以str开头的内容都保留用于实现。)

实际上char数组不是以'\\ 0'结尾,因此strlen无法知道它将停止计算字符串的长度,因为它的语法是int strlen(char * s)->它返回no。 字符串中的char直到'\\ 0'(NULL char),所以要避免这种情况,我们必须追加NULL char(b [length] ='\\ 0')

否则,在字符串中使用strlen count char直到遇到NULL计数器

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM