搜索
查看: 1253|回复: 18
打印 上一主题 下一主题

C语言常见错误总结

[复制链接]
跳转到指定楼层
楼主
发表于 2017-8-11 12:40:51 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 赵林 于 2018-4-21 10:57 编辑

C语言常见错误总结
每次登录啊哈磊网站,都会看到很多人提一些重复的问题。希望以后遇到问题自己想想,实在不行查一下,最后再问。
常见错误:

1.编译成功,运行时却弹出类似这样的窗口:见图片
编译正常,输入1(黑圈),程序却弹出了一个警告窗口(红圈)。是这个原因:
①scanf("%d",a);没写取址符&。应改为scanf("%d",&a);为什么?因为输入的数是存到a的地址里,不是存到a的数值里。  因为我习惯了cin>>a; 所以我经常犯这个错误。没关系,加上&就行了。

2.Sleep()函数
这是最常见的问题之一。(求求大家别再问了!)使用此函数需要注意以下几点:
①S要大写,否则编译器将不能识别
②由于Sleep()函数的定义在Windows.h头文件里,所以要在程序开头写#include <windows.h>
  也可以自己写一遍函数定义(这句话初学者请忽略)
③括号里写一个整数,代表等待的毫秒数,请注意,1秒=1000毫秒
④我看到很多人用Sleep(5000);作为程序最后的等待语句,我个人建议一般不要这样做(但有时还是可以的)。
  最好调用system("pause");如果不想显示“请按任意继续. . .”的话,改成system("pause>nul");

3.float浮点型
有些人说《啊哈C》30页“更进一步,动手试一试”第1题5.2+3.1输出的是8.299999,不是8.3。这个问题我以前倒还没注意过(因为我用的是C++的cout,cout输出浮点数有默认设置)。现在用printf一试,果真如此。以下是解决方法(啊哈磊也应该改一下代码):
①简单,把float换成double就行了。为什么呢?因为计算机把5.2和3.1存储到变量中是用的2进制,这样存储有些数2进制  会变成无限循环小数。再相加就难免有问题。double精度高一些,可以克服问题。(比如用计算器算1÷3×3,答案是  0.9999999999,而不是1,这是一个道理)
②不定义变量c,把printf("%f",c);改成printf("%f",a+b);或干脆改成printf("%f",5.2+3.1);就行了。这样没有了相加   并存储的步骤,答案就会正确(尽管这样还是强烈建议使用double,还不行就用long double)。
4.编译成功却不能运行。原因:
①看看文件名是不是以.c结尾,生成的文件是不是以.exe结尾。
②另外,文件名在啊哈C中不能有.号。

5.定义变量/函数
①如果编译器下方提示"a"was not declared in this scope(至少Dev-c++的提示是这样,不过啊哈C应该也大同小异),  (意思是“a没有在范围内声明”)说明你没有定义a或把a拼错了。仔细检查吧。
②提示invalid suffix "a" on integer constant,说明你定义的变量是以数字开头的。(意思是“a是整型常量的无效后  辍”)编译器认为a是类似u(无符号后辍)、L(长型后辍)这样的后辍。改一下变量名就行了。
③提示stray '\345' in program(引号内会变),说明你用了汉字或¥@#这样的字符定义变量。改变量名就行了。

6.if()判断
判断输入的数是否等于1,:无论输入什么都显示yes
①原因:把if(a==1)写成了if(a=1)。计算机先执行a=1,在判断(a=1)是否为真。《啊哈C》68页讲过,一个数判断真假, 如果是0则为假,否则为真。(a=1)的值是1,为真,所以输出yes。

scanf.jpg (71.23 KB, 下载次数: 6)

scanf.jpg
来自 2#
 楼主| 发表于 2017-8-11 13:20:56 | 只看该作者

C语言常见错误总结

继续。

4.编译成功却不能运行。原因:
①看看文件名是不是以.c结尾,生成的文件是不是以.exe结尾。
②另外,文件名在啊哈C中不能有.号。

5.定义变量/函数
①如果编译器下方提示"a"was not declared in this scope(至少Dev-c++的提示是这样,不过啊哈C应该也大同小异),  (意思是“a没有在范围内声明”)说明你没有定义a或把a拼错了。仔细检查吧。
②提示invalid suffix "a" on integer constant,说明你定义的变量是以数字开头的。(意思是“a是整型常量的无效后  辍”)编译器认为a是类似u(无符号后辍)、L(长型后辍)这样的后辍。改一下变量名就行了。
③提示stray '\345' in program(引号内会变),说明你用了汉字或¥@#这样的字符定义变量。改变量名就行了。

6.if()判断
判断输入的数是否等于1,:无论输入什么都显示yes
①原因:把if(a==1)写成了if(a=1)。计算机先执行a=1,在判断(a=1)是否为真。《啊哈C》68页讲过,一个数判断真假, 如果是0则为假,否则为真。(a=1)的值是1,为真,所以输出yes。

(今天先到这里,周一再发表新的内容)

点评

你也坐在沙发上  发表于 2017-10-14 18:13
沙发上有钉子  发表于 2017-8-12 14:25
挤挤沙发  发表于 2017-8-11 16:04
来自 10#
 楼主| 发表于 2017-8-15 10:18:48 | 只看该作者
推荐
 楼主| 发表于 2017-8-14 18:13:18 | 只看该作者
赵林 发表于 2017-8-13 11:20
抱歉。周末没时间:星期一准时发布新内容,请积极回帖

太对不起了,今天时间太紧,来不及发新内容了。明天补上

点评

好  发表于 2017-8-14 20:10
板凳
发表于 2017-8-11 16:04:57 | 只看该作者
Good
地板
发表于 2017-8-11 16:07:10 | 只看该作者
5.2:变量不能以数字开头

点评

没有以数字开头。5.2是实型常数  发表于 2017-8-11 17:34
5#
发表于 2017-8-12 11:32:41 | 只看该作者
[mw_shl_code=c,true]#include <stdio.h>
#include <stdlib.h>
int main()
{
        float a = 5.2,b = 3.1,c = a + b;
    printf("%.1f",c);
        system("pause > nul");
        return 0;
}[/mw_shl_code]

点评

结果对,但问题是如果是scanf怎么办?你也不知道有几位小数。再说了,我们要求精确的,不要近似(虽然...)  发表于 2017-8-12 14:25
6#
发表于 2017-8-12 11:46:32 | 只看该作者
这叫一错再错
7#
发表于 2017-8-12 11:47:12 | 只看该作者
我说5:②               

点评

不要以为电脑和你智商一样高  发表于 2017-8-12 14:23
对。确实是。但编译器认为a是1的后缀  发表于 2017-8-12 14:22
8#
 楼主| 发表于 2017-8-13 11:20:10 | 只看该作者
抱歉。周末没时间:星期一准时发布新内容,请积极回帖
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表