字符串长度打印奇怪的数字。我的代码中的问题在哪里?

String length prints weird numbers. Where is the issue in my code?

我的任务是:编写一个不使用库计算字符串长度的程序

这是我的回答,但是执行起来有问题。长度显示不正确!对于我插入的任何字符串,执行显示长度为 107 或 127。

#include <stdio.h>
#include <stdlib.h>

int main()
{
   //Declaration of variables :
   char ch[50+1];
   int length, i;

   //data :
   printf("ch : ");
   scanf("%s", &ch);
   printf("\n");

   //Search length of string :
   i = 0;
   do
   {
       if(ch[i] == '[=10=]')
       {
           length = i;
       }
       else
       {
           i++;
       }
   }
   while(ch[i] != '[=10=]');

   //Result "
   printf("length pf %s is : %d \n", ch, length);

   return 0;
} ```

do-while 循环的算法有问题。

计数器 i 在条件检查前不久递增。

如果在下一个数组元素中找到 '[=15=]'(请注意,i 递增)循环立即中断并且无法将 length 设置为 i在下一次迭代(因为没有下一次迭代)。

由于length没有初始化,程序有undefined behavior.

变化:

do
{
   if (ch[i] == '[=10=]')
   {
       length = i;
   }
   else
   {
       i++;
   }
}
while (ch[i] != '[=10=]');

while (ch[i] != '[=11=]') i++;

length = i;

或更简单:

while (ch[i] != '[=12=]') length++;

并省略计数器i,但您需要0初始化length


旁注:

  1. scanf("%s", &ch); 更改为 scanf("%s", ch);。 - ch 衰减为指向其第一个元素的指针。

  2. scanf() -> scanf("%50s", ch);处使用长度修饰符,以确保当用户输入超过50个字符的字符串时不会发生缓冲区溢出。

  3. 如果在使用输入时发生错误,请始终检查 scanf() 的 return 值。

  4. 永远不要忽略编译器警告。对于 scanf("%50s", ch);,编译器应该发出警告。