C 如何确定字符串的长度(不使用strlen())

C 如何确定字符串的长度(不使用strlen()),c,strlen,C,Strlen,使用此函数,如何查找字符串的长度?我指的不是使用strlen(),而是创建它。非常感谢您的帮助。循环/迭代字符串,并保持计数。当您点击\0时,您已经到达了字符串的末尾 涉及的基本概念包括循环、条件(用于测试字符串的结尾)、维护计数器和访问字符序列中的元素 注意:还有更多惯用/巧妙的解决方案。然而OP显然是C和编程的新手(无意冒犯,我们都是新手),因此,像一个解决方案那样对他们进行指针运算,或者编写可能过于简洁/紧凑的解决方案,与其说是OP的需要,不如说是海报编程技能的展示:)故意为一个简单易懂的

使用此函数,如何查找字符串的长度?我指的不是使用strlen(),而是创建它。非常感谢您的帮助。

循环/迭代字符串,并保持计数。当您点击
\0
时,您已经到达了字符串的末尾

涉及的基本概念包括循环、条件(用于测试字符串的结尾)、维护计数器和访问字符序列中的元素

注意:还有更多惯用/巧妙的解决方案。然而OP显然是C和编程的新手(无意冒犯,我们都是新手),因此,像一个解决方案那样对他们进行指针运算,或者编写可能过于简洁/紧凑的解决方案,与其说是OP的需要,不如说是海报编程技能的展示:)故意为一个简单易懂的解决方案提建议,至少让我投了一票反对票(是的,这是“虚构代码”我不想准备提供代码解决方案,但让OP在一些指导下解决它)

要点:我认为答案应该根据提问者的水平进行调整

size_t stringlength(const char *s)
令人困惑的部分可能是表达式
*(s++)
,这里使用
++
操作符移动指针指向缓冲区中的下一个字符,然后使用解引用操作符
*
获取指针位置的内容。另一个更清晰的方法是:

size_t stringlength(const char *s) {
   size_t count = 0;
   while (*(s++) != '\0') count++;
   return count;
}
另外两个参考版本(但不太清晰)是:


尽管这里所述的代码只是一个参考,让您了解如何实现上述答案中所述的算法,但有更有效的方法来满足相同的要求(例如,检查一次检查4个字节)

假设s是非空指针,以下函数从其开始遍历,直到找到终止零为止。对于传递的每个字符
s++计数递增
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;
}
这可能不是相关代码,但我认为值得知道。 因为它节省了时间…


对于字符串::

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);

size_t stringlength(const char *s) {
   size_t count = 0;
   while (*s) {
     s++;
    count++;
   }
   return count;
}


迭代
s
,直到到达0终止符,途中递增计数器。从0递增计数,直到当前字符为“\0”,谢谢。我理解它背后的想法,但是代码呢?对不起,我只是有点迷路了@卢西斯密斯:我以为你想实施它。@Downvoter为什么要downvote?是因为我没有提供代码吗?我想有足够的信息让OP自己来实现这一点。没有解释的向下投票无助于OP,SO或我。@RudyVelthuis是的,我理解额外变量。你“不难理解”。。同意,对于已经熟悉惯用C和指针的人来说,我不认为这适用于给定问题的OP。我试着将我的答案调整到OP的水平。我只是对否决票感到好奇(我已经超过了当天的分数,所以2分无关紧要)。然而,我决不会对基于风格的功能性解决方案(特别是旨在提供帮助的解决方案)投反对票。我不认为一般来说,无论在哪一个级别上,都很难理解。我希望人们理解一个简单的减法。如果你想让它成为一个公共API,请确保你检查了一个有效的指针。如果(s==\uu nullptr)。我没有投反对票,但也许考虑到OP的问题,答案有点太习惯了?也就是说,有一个不那么“简洁”的代码版本也可能有助于交流代码背后的想法?IMHO:make
if(s==NULL)返回0可以掩盖一些编程错误。空值没有长度。NULL是“无”。因此,如果传递了一个空指针,程序员将获得并修复一个分段错误。您的第一个实现更好。另外,我没有投反对票,也许有人这样做的原因是因为你可以在标记为homeworkd的线程中输入完整的代码。你可以通过解释如何自己做来帮助它。@Jack是的,你是对的,这应该是seg故障,一些错误可以隐藏。我只是提供代码,因为她在第一个答案中说她不知道如何开始,所以我给了她一个参考。这段代码并不是实现这一点的最佳方法(更好的实现应该在每次迭代中检查4个字节,因为这只是一种引入一些新手可能不熟悉的概念(指针解引用、运算符优先级等)的方法,以一种比
while(*p++)更清晰的方式C++,无论如何,谢谢你在我之前的注释中解释了一个错误:我的意思是“你不能完全代码”。..@h3nr1x,我明白。您想为C编程初学者编写一个易读的代码。但正如我前面提到的,您的第一个实现(不使用算术指针表达式)适用于此概念。不要忘记这是一个家庭作业问题。解释如何做,而不是只发布完整的代码。编辑此内容时,我保留了不过,在我的世界里,这个函数仍然应该检查s是否为null。在C(以及其他许多语言)中,不应该假设指针是OK的。
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