c语言双引号和单引号的区别_初学C语言Bug大赏

本文总结了C语言初学者在编程过程中遇到的一些常见错误,包括变量初始化、忘写分号、半角全角符号混淆、数学表达式错误、char类型赋值误区以及printf与scanf函数使用误解。通过实例和解析,帮助初学者理解并避免这些Bug。
摘要由CSDN通过智能技术生成

啦啦啦,进了计算机系。不用说学习C语言当然少不了。说到写程序少不了是什么?对就是Bug。

什么你还不知道什么是Bug?

Bug是计算机领域专业术语,bug原意是“臭虫”,现在用来指代计算机上存在的漏洞,原因是系统安全策略上存在的缺陷,有攻击者能够在未授权的情况下访问的危害。

名称由来:

为马克2号(Harvard Mark II)编制程序的葛丽丝·霍波(Grace Hopper)是一位美国海军准将及计算机科学家,同时也是世界最早的一批程序设计师之一,有一天,她在调试设备时出现故障,拆开继电器后,发现有只飞蛾被夹扁在触点中间,从而“卡”住了机器的运行。于是,霍波诙谐的把程序故障统称为BUG(飞虫),把排除程序故障叫DEBUG,而这奇怪的“称呼”,竟成为后来计算机领域的专业行话。

以上引自百度百科:bug (计算机领域漏洞)

经过这些天的学习,我整理了我与我的同学们在上机过程中遇到的Bug。有句话说得好:“那些受过的伤,终究会成为我们身上的勋章”。有错误是件好事,它可以让我们变成“大神"又进一步。好了,废话不多说,Follow me 开始Debug吧!

d0bb0c847b7e036286b4ff14002a4e33.png

一.变量初始化不规范导致的错误

#include #include int main()//这是个运动会奖牌数目统计{    int n,z;  //count1表示金牌数目,以此类推count2,count3    int count1,count2,count3;//这里属于局部变量初始化不规范    printf("请输入运动会天数:");    scanf("%d",&n);    for(int i=0;i

这个程序的运行图:

291233cd2e6e272ef1479a246fd58002.png

很显然银牌数目是错的,3+5+5怎么可能等于29呢?经过我的debug发现一开始变量count2的值就不为零。但是为什么呢?于是我去查了一下资料,找到了问题所在:

原来啊,这是由于变量存放的位置是不同导致的。全局变量、静态变量处于数据区,默认初始值为0(指定的话就为指定值),而局部变量处于堆栈区,它的值为内存中的值,是随机的。

这里我根据这个理解我给出了两种改法

法1:把int count1,count2,count3;变成全局变量

#include #include int main()//这是一段关于密码输入判断的代码{    char String[5]//这里忘写”;“了    printf("请输入4位数的密码:");    gets(String);//接收用户的输入密码    int Stringlength=strlen(String);    if(Stringlength==4)//判断输入的数是否超位    {                if(strcmp(String,"1234")==0)//设定的密码是:1234        {            printf("密码正确");        }        else        {            printf("密码错误");        }    }    else    {        printf("格式错误!你输入了%d位的密码",Stringlength);    }    return 0;}

法2:对局部变量进行初始化赋值

#include #include int main()//这是个运动会奖牌数目统计{    int n,z;  //count1表示金牌数目,以此类推count2,count3表示银牌,铜牌    int count1=0,count2=0,count3=0;//这里对局部变量进行初始化赋值    printf("请输入运动会天数:");    scanf("%d",&n);    for(int i=0;i

它们都是正确的,运行图:

5da268e6088ba8aebbc0d9a0387c0847.png

感悟必要的初始化是重要的,不要指望编译器的默认规则。养成良好的编程习惯。

二.忘写分号

#include #include int main()//这是一段关于密码输入判断的代码{    char String[5]//这里忘写”;“了    printf("请输入4位数的密码:");    gets(String);//接收用户的输入密码    int Stringlength=strlen(String);    if(Stringlength==4)//判断输入的数是否超位    {                if(strcmp(String,"1234")==0)//设定的密码是:1234        {            printf("密码正确");        }        else        {            printf("密码错误");        }    }    else    {        printf("格式错误!你输入了%d位的密码",Stringlength);    }    return 0;}

感悟:这种错误是比较容易犯的,特别是零基础的小白和那些先学Python后学C语言的人(因为Python语句结束不用在它后面加" ; ",会有点不习惯)。

改过后的代码以及它的运行图,如图:

a34e5ed1e7864bacdd46682046a1bdc4.png

左边为正确的代码,右边为它的运行图

三.半角与全角问题(中英文符号问题)

#include #include int main(){    char String[5];    printf("请输入4位数的密码:");    gets(String);//接收用户的输入密码    int Stringlength=strlen(String);    if(Stringlength==4)//判断输入的数是否超位    {                if(strcmp(String,"1234")==0)//密码是:1234        {            printf("密码正确");//这里写的”;“是中文的符号,要改为英文的”;“(这里有一点看不出来)        }        else        {            printf("密码错误");        }    }    else    {        printf("格式错误!你输入了%d位的密码",Stringlength);    }    return 0;}

感悟:这个问题还好,用个好一点的编程软件就好了(因为你输入的中文标点符号和英文的标点符号在编程软件中的颜色是不一样的)。只不过如果你是用VC6来写代码,就没有这功能,很难看出二者的区别。(我用的是CodeBlocks,还不错!)

它俩区别在编程软件上的效果图:

076825412bce16c5c6ae7c2d2f52e88f.png

上面黑色的分号是中文符号,下面红色的是英文符号

四.数学表达式上的惯性思维

#include #include int main(){    int x=5;    int a=2x-1;//这里少写了*,应改为“int a=2*x-1;”    printf("%d",a);//将输出9    return 0;}

感悟:哈哈哈,这个问题我就经常犯[捂脸]。经常漏掉”*“运算符。逻辑上没错,但表达上错了

运行效果图:

7b46a02110bdc08469e848d2eee0e805.png

五.char类型赋值时单引号写成了双引号

#include #include int main(){   char a="a"; //单引号写成了双引号.要改成“ char a='a'; ”   printf("%c",a);//将输出a   return 0;}

感悟乱迁移printf(" ");这种双引号表达,char类型要用单引号。

当然关于char也可以这么写:

#include #include int main(){   char a=97; //单引号写成了双引号.要改成“ char a='a   printf("%c",a);//将输出a   return 0;}

以上两种表达运行效果是一样的,都是输出a

如图:

be37e2bdc37e5daff83883642246dcb2.png

六.乱迁移printf语句的指定数据宽度和小数位数用法在scanf语句上

#include #include int main(){    float  a=0;    scanf("%.2f",&a);    printf("%.2f",a);    return 0;}

感悟:以为printf("%.2f",a);可以这么表达,那scanf("%.2f",&a);也可以这么表达。这是错误的!

说到scanf函数不得说一下它的定义宽度的问题:

#include #include int main(){    int a=0;//对变量a进行初始化    scanf("%2d",&a);//输入数字(只读入2个字符)    printf("%d",a);//它将输出你刚刚输入的数字的前两位字符    return 0;}

运行效果图

9e0e3b0f5394b4201a1fd22b7761b1f2.png

后面的3456以整型的方式存在于缓存中

好了,我的总结到此结束!谢谢大家的耐心阅读[笑]

大家一起进步

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
[问题描述] 参加运动会有n个学校,学校编号为1……n。比赛分成m个男子项目,和w个女子项目。项目编号为男子1……m,女子m+1……m+w。不同的项目取前五名或前三名积分;取前五名的积分分别为:7、5、3、2、1,前三名的积分分别为:5、3、2;哪些取前五名或前三名由学生自己设定。(m<=20,n<=20) [基本要求] (1)可以输入各个项目的前三名或前五名的成绩; (2)能统计各学校总分 (3)可以按学校编号、学校总分、男女团体总分排序输出; (4)可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校。 规定:输入数据形式和范围:20以内的整数(如果做得更好可以输入学校的名称,运动项目的名称) 输出形式:有中文提示,各学校分数为整形   界面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。 存储结构:学生自己根据系统功能要求自己设计,但是要求运动会的相关数据要存储在数据文件中。(数据文件的数据读写方法等相关内容在c语言程序设计的书上,请自学解决)请在最后的上交资料中指明你用到的存储结构; 测试数据:要求使用1、全部合法数据;2、整体非法数据;3、局部非法数据。进行程序测试,以保证程序的稳定。测试数据及测试结果请在上交的资料中写明;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值