【发布时间】:2014-02-28 02:13:31
【问题描述】:
我正在努力尝试理解一些字符串函数,以便在以后的编码项目中更有效地使用它们,所以我设置了下面的简单程序:
#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 返回 = 4 strspn 返回 = 4
但是,我看到 strlen return = 6 和 strspn return = 4。据我了解,char test_string[5] 应该分配 5 个字节的内存并将十六进制 00 放入第五个字节。然后 for 循环(甚至不应该是必要的)应将 test_string 的所有内存字节设置为十六进制 00。然后,立即进行的行应填充 test_string 字节 1 到 4(或 test_string[0] 到 test_string[3])用我指定的。此时调用 strlen 应该返回一个 4,因为它应该从字符串 0 的地址开始并计数一个增量,直到它遇到第一个空字符,它位于字符串 [4] 处。然而 strlen 返回 6。任何人都可以解释一下吗?谢谢!
【问题讨论】:
-
欢迎来到 Stack Overflow。请阅读About 页面。请注意,您问题中的说法是不可信的;
strlen()既简单又经过广泛测试。如果它是错误的,那将是一个众所周知的问题(很快就会得到解决)。因此,您的问题是strlen()没有给您预期的结果,但您的预期错误的可能性比strlen()错误的可能性更大。 -
嗨乔纳森,我想这个问题的标题不好。我绝对知道 strlen 写得正确,没有任何问题,而且我的问题是由于我正在做的事情,我只是无法弄清楚它对我的生活有什么影响。在加入之前,我快速浏览了 about 页面,但我会在一分钟内为您完整阅读。谢谢!
-
看看你的 init 循环的上限。我在这里根本看不到任何可以将 NULL 字节放入您的字符串的代码。 (提示:分配没有初始化器的变量并不能保证那里的内存内容。)
-
BRPocock,谢谢。我意识到你的暗示与其他给出答案的人交谈,并发现问题确实在我的初始化循环中。正如许多人指出的那样,最好的主意是: char test_string[] = "TEST";和 char test_string2[] = "GO_TEST"; - 我不知道为什么我没想过要使用这些,因为那个技巧是我过去拉过很多很多次的。显然,在我大约 1.5 年的编码中,我仍然没有了解到编译器不是我的朋友哈哈。 C 是一种非常高效的语言,我只需要在做出假设之前确保我知道它是如何运行的。