gpt4 book ai didi

C 编程 - strlen 的功能

转载 作者:太空狗 更新时间:2023-10-29 15:13:56 24 4
gpt4 key购买 nike

我正在努力尝试理解一些字符串函数,以便在以后的编码项目中更有效地使用它们,因此我设置了下面的简单程序:

#include <stdio.h>
#include <string.h>

int main (void)
{
// Declare variables:
char test_string[5];
char test_string2[] = { 'G', 'O', '_', 'T', 'E', 'S', 'T'};
int init;
int length = 0;
int match;

// Initialize array:
for (init = 0; init < strlen(test_string); init++)
{ test_string[init] = '\0';
}

// Fill array:
test_string[0] = 'T';
test_string[1] = 'E';
test_string[2] = 'S';
test_string[3] = 'T';

// Get Length:
length = strlen(test_string);

// Get number of characters from string 1 in string 2:
match = strspn(test_string, test_string2);

printf("\nstrlen return = %d", length);
printf("\nstrspn return = %d\n\n", match);

return 0;
}

我希望看到以下返回:

strlen 返回 = 4strspn 返回 = 4

但是,我看到 strlen return = 6 和 strspn return = 4。据我了解,char test_string[5] 应该分配 5 个字节的内存并将 hex 00 放入第五个字节。 for 循环(甚至不应该是必要的)然后应将 test_string 的所有内存字节设置为十六进制 00。然后,紧接着的行应填充 test_string 字节 1 到 4(或 test_string[0] 到 test_string[3])用我指定的。此时调用 strlen 应该返回 4,因为它应该从字符串 0 的地址开始并计算一个增量,直到它遇到第一个空字符,即 string[4]。然而 strlen 返回 6。任何人都可以解释一下吗?谢谢!

最佳答案

char test_string[5];

test_string 是一个包含 5 个未初始化 char 对象的数组。

for (init = 0; init < strlen(test_string); init++)

轰隆隆。 strlen 扫描第一个 '\0' 空字符。由于 test_string 的内容是垃圾,因此行为未定义。如果碰巧有一个空字符,它可能会返回一个小值,或者如果 test_string 中没有任何零字节,它可能会返回一个很大的值或程序崩溃。

即使情况并非如此,在 for 循环的 header 中评估 strlen() 也是低效的。每个 strlen() 调用都必须重新扫描整个字符串(假设您给了它一个有效的字符串),因此如果您的循环有效,它将是 O(N2).

如果您希望 test_string 只包含零字节,您可以这样初始化它:

char test_string[5] = "";

或者,因为您稍后初始化了前 4 个字节:

char test_string[5] = "TEST";

或者只是:

char test_string[] = "TEST";

(后者让编译器计算出它需要 5 个字节。)

回到你的声明:

char test_string2[] = { 'G', 'O', '_', 'T', 'E', 'S', 'T'};

这导致 test_string2 的长度为 7 个字节,没有尾随 '\0' 字符。这意味着将 test_string2 传递给任何需要指向字符串的指针的函数都会导致未定义的行为。你可能想要这样的东西:

char test_string2[] = "GO_TEST";

关于C 编程 - strlen 的功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22084848/

24 4 0
文章推荐: c - n & ~(n - 1) 这个函数有什么作用?
文章推荐: c - 如何在 C 函数中将宏作为参数传递?
文章推荐: javascript - 使用 CSS 变换缩放
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com