这个错误初学者一定会犯:C语言学习日志(三)

引言:

       

      在C语言学习巩固的过程,难免会遇到错误。今天我室友在完成编程作业的过程中遇到一个非常有意思的问题,我们来一起看一看吧;

题目:

【问题描述】编程实现在一个字符串中查找指定的字符,并输出指定的字符在字符串中出现的次数及位置,如果该字符串中不包含指定的字符,请输出提示信息。

【输入形式】第一行输入字符串,第二行输入要查找的字符
【输出形式】如果查找到第一行输出出现次数,第二行输出各个位置,否则输出:No match!

【样例输入】

dfdfjkjjfdffd

d
【样例输出】

4

0 2 9 12

接下来就是我室友的解题原本:

#include <stdio.h>
int main()
{
	char ch;
	char str[999];
	int count[999],j = 1,i =0,c=0,flag=0;        
    scanf("%s\n",str);  //获取输入字符串
	scanf("%c",&ch);    //获取要求寻找的字符
    for(; str[i]!='\0'; i++)
	{
		if(ch == str[i])
		{
         flag=1;
		 count[j] = i;     //flag的作用是代表是否有这个字符,没有就是0,有就是1.
		 j++;              //count数组是用来记下标的
		}
	}
		count[j]='\0';         //这里处理是为了后面检测到‘\0’就停止输出;
		count[0]=j-1;
		if(flag==1)            //flag作用的地方
		{
		printf("%d\n",count[0]);           
		for(j = 1; count[j] != '\0'; j++)
		{
			printf("%d ",count[j]);}
		}
		else
		{
	     printf("No match!");
		}
	return 0;
}

             不用看代码的实现思路的复杂,毕竟能完成任务的程序就是好程序;

             乍看一下代码的实现,可以说感觉是能够完成任务;事实证明也确乎如此:

             编译一下,yea~没出错!似乎向成功迈出一步了!

                芜湖,起飞 ,来测试结果;怎么看,三组结果都是对的;

 

              似乎一切都非常顺利,但是上交时那个有个测试结果却把这个小小的bug炸了出来;

             它能够输出字符重复的次数,但是它的下标不输出了!

           我们不信,再换了这串字符的另一个字符,下标成功输出了!

            这反而令我们更加百思不得其解了;当时心想:“会不会是神秘力量影响,哈哈哈”;

             在此后我们尝试了第一次修改,因为它的下标不输出,所以我们大概可以定位到后面的代码出错了,因此选择了改成这样,结果就正确了

	for(j = 1; count[j] != '\0'; j++)
		{
			printf("%d ",count[j]);}
		}
 
                      ||
                      ||
                      VV
    	for(i = 1; i < j; i++)
		{
			printf("%d ",count[i]);}
		}

                这样一对比,很容易发现是限制条件出了问题,我们突然灵光一现,count[j] != '\0';

           一定出了问题!在反复观察代码后,终于是发现了问题!

    因为在前面加上了:

		count[j]='\0';

 利用‘\0’来检测输出结束;似乎很合理,但是我们忽略了一个重要的问题:

               ‘\0’在计算机里面是怎么储存的?以asc||码值来储存的!在我们眼里它是\0;而在计算机内他就是0!

              因此,在检查到0这个下标中是我们要检查重复的字母时,会在count里面储存下标  0;

              就因为这样,将count[j] != '\0'翻译过去就会发现,就是count[j]  != 0;

             因此,输出时检测到count[1]   = 0;直接不符合限制条件,pase掉,不执行后面的了!

总结:

              今天这个小小的错误显而易见的在警告我们,不能够再单纯的以人的视角去观察程序,而是选择学会用计算机规律去考虑有关于代码的问题,要学会”换位思考“;

           同样要记住的一个简单知识点就是:字符在计算机中是以数字的方式储存,可以说int整型与char的字符没有严格界限;

char str  = 'a';
printf("%c",97);
printf("%c",str);

             都会输出a这个字符;

###

        好了,今天的分享就到这里了,觉得有帮助的话,就点个赞再走吧!         

还有个大家几乎会犯的错误,大家可以来看看哦!  

以及关于运算符的问题

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值