Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 字符串长度打印奇怪的数字。我的代码中的问题在哪里?_C_String_Loops_Execution - Fatal编程技术网

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

C 字符串长度打印奇怪的数字。我的代码中的问题在哪里?,c,string,loops,execution,C,String,Loops,Execution,我的任务是:编写一个程序,在不使用库的情况下计算字符串的长度 这是我的答案,但执行有问题。长度显示不正确!对于我插入的任何字符串,执行显示长度为107或127 #include <stdio.h> #include <stdlib.h> int main() { //Declaration of variables : char ch[50+1]; int length, i; //data : printf("ch : "); s

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

这是我的答案,但执行有问题。长度显示不正确!对于我插入的任何字符串,执行显示长度为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] == '\0')
       {
           length = i;
       }
       else
       {
           i++;
       }
   }
   while(ch[i] != '\0');

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

   return 0;
} ```
#包括
#包括
int main()
{
//变量声明:
char-ch[50+1];
int长度,i;
//数据:
printf(“ch:”);
scanf(“%s”&ch);
printf(“\n”);
//字符串的搜索长度:
i=0;
做
{
if(ch[i]=='\0')
{
长度=i;
}
其他的
{
i++;
}
}
while(ch[i]!='\0');
//结果“
printf(“长度pf%s为:%d\n”,ch,长度);
返回0;
} ```

执行while循环的算法有问题

计数器
i
在条件检查前短时间递增

如果在下一个数组元素中找到
'\0'
(注意,
i
是递增的),循环将立即中断,并且在下一次迭代中将无法将
长度设置为
i
(因为没有下一次迭代)

由于未初始化
length
,因此程序已启动

更改:

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

或者更简单:

while (ch[i] != '\0') length++;
并省略计数器
i
,但需要通过
0
初始化
length


旁注:

  • scanf(“%s”,和&ch);
    更改为
    scanf(“%s”,和ch);
    -
    ch
    衰减为指向其第一个元素的指针

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

  • 如果使用输入时出错,请始终检查
    scanf()
    的返回值

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


  • 单步执行程序。
    length=i;
    行永远不会执行。(我认为编译器应该对此发出警告,所以请检查编译器标志。)不,它没有。程序执行,但我插入的任何字符串的长度都显示为107“!-请注意,您最多只能插入50个字符的字符串。否则,您的写入超出了调用未定义行为的数组边界。请使用长度修饰符确保不会发生类似于
    scanf(“%50s”,ch)的情况
    那不是真的。它显示了一个未初始化的值;你自己说它有时会返回一个或另一个。不相信我?在循环之前添加
    length=2020;
    来测试它。现在它将始终返回
    2020
    。好吧,那么为什么do while循环没有得到长度?请问错误在哪里?非常感谢!perfec现在我不回答了,我理解了错误!我很感谢你,朋友。@BacimOueslati我很高兴能帮助你。另外,请看一下我补充的旁注。它们也很重要。我做了,它们非常有用。非常感谢你!@BacimOueslati找到了一种方法使它更简单。你可以完全省略计数器
    i
    。甚至更简单
    对于(长度=0;ch[length];长度++);
    while (ch[i] != '\0') length++;