size_t stringlength(const char *s)
使用这个函数,怎么能找到一个字符串的长度呢?我不是指使用 strlen()
,而是创建它。任何帮助是极大的赞赏。
循环/迭代字符串,保持计数。当你点击 时\0
,你已经到达了你的字符串的末端。
涉及的基本概念是循环、条件(测试字符串的结尾)、维护计数器和访问字符序列中的元素。
注意:有更多惯用/聪明的解决方案。然而,OP 显然是 C 和编程的新手(无意冒犯,我们都是从新手开始的),所以像解决方案之一那样对它们施加指针算术,或者编写可能过于简洁/紧凑的解决方案并不是关于 OP 的需求,而是更多关于展示海报的编程技巧 :) 故意为简单易懂的解决方案提供建议为我赢得了至少一个反对票(是的,这是我什至没有提供的“虚构代码”。我不想准备好提供代码解决方案,但让 OP 在一些指导下弄清楚)。
要点:我认为答案应始终根据提问者的水平进行调整。
size_t stringlength(const char *s) {
size_t count = 0;
while (*(s++) != '\0') count++;
return count;
}
令人困惑的部分可能是表达式*(s++)
,在这里您使用++
运算符移动指针以指向缓冲区中的下一个字符,然后使用解引用运算符*
获取指针位置处的内容。另一种更清晰的方法是:
size_t stringlength(const char *s) {
size_t count = 0;
while (s[count] != '\0') count++;
return count;
}
另外几个参考版本(但不太清晰)是:
size_t stringlength(const char *s) {
size_t count = 0;
while (*s++) count++;
return count;
}
size_t stringlength(const char *s) {
const char* c = s;
for (; *c; c++);
return c - s;
}
尽管此处所述的代码只是为您提供有关如何实现上述答案中描述的算法的想法的参考,但存在执行相同要求的更有效方法(例如,检查glibc 实现,一次检查 4 个字节)
这可能不是相关代码,但我认为值得了解。因为省时...
int a[] = {1,2,3,4,5,6};
unsigned int i,j;
i = &a; //returns first address of the array say 100
j = &a+1; //returns last address of the array say 124
int size = (j-i)/sizeof(int); // (j-i) would be 24 and (24/4) would be 6
//assuming integer is of 4 bytes
printf("Size of int array a is :%d\n",size);
对于字符串::
char a[] = "Hello";
unsigned int i,j;
j = &a+1; //returns last address of the array say 106
i = &a; //returns first address of the array say 100
printf("size of string a is : %d\n",(j-i)-1); // (j-i) would be 6
如果您对 &a+1 如何返回数组的最后一个地址感到困惑,请查看此链接。
假设 s 是一个非空指针,以下函数从 s 开始遍历 s,直到找到终止零。对于每个传递的字符,s++;
计数都会增加count++;
。
size_t stringlength(const char *s) {
size_t count = 0;
while (*s) {
s++;
count++;
}
return count;
}