C 字符串长度打印奇怪的数字。我的代码中的问题在哪里?
我的任务是:编写一个程序,在不使用库的情况下计算字符串的长度 这是我的答案,但执行有问题。长度显示不正确!对于我插入的任何字符串,执行显示长度为107或127C 字符串长度打印奇怪的数字。我的代码中的问题在哪里?,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
#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++;