首页
 

通知公告

C语言易错点整理

来源:欧亿体育点击:时间:2024-01-22 01:03

前言:

本文涵盖了博主在平常写C语言题目时经常犯的一些错误,在这里帮大家整理出来,一些易错点会帮大家标识出来,希望大家看完这篇文章后有所得,引以为戒~

一、

题目:

解答:

首先在这个程序中有两个x,y,一个是在主函数中定义的局部变量,另一个是全局变量。

而在swap函数中将两个值进行了交换,因为在主函数中定义的变量只在主函数中有效,因为主函数也是一个函数,它与其他函数是平行关系!所以swap函数是将在主函数外部的全局变量进行了交换。

其次在主函数中我们需要打印x,y,根据输出语句,局部变量优先的原则,所以最后的结果就是3,8

易错点:

  1. 不知道在主函数中定义的变量只在主函数中有效
  2. 不知道在输出语句中,局部变量优先的原则

二、

题目:

解答:

本题选择B,

\ddd ddd表示13个八进制数(d用八进制数表示才合法

\xhh hh表示12位十六进制数 (h用十六进制数表示才合法

原因是 '\8' 表示错误,因为转义字符\后面只要跟了十进制的数字,就是表示八进制数,但是八进制表示的范围是0~7, 所以'\8' 表示错误。

易错点:

不知道常见转义字符的形式,\后面直接跟数字,表示是一个八进制数,但表示形式必须要用0~7;同理/后面跟x表示是一个十六进制数,表示形式也必须使用十六进制~

小总结:

以后看到字符表示中有\在前面就表示它是一个转义字符,看\后面的字母来判断这是什么样的字符。

三、

题目:

解答:

本题要求根据输入的日期,计算是这一年的第几天。

我们可以每一月的月数存放在一个数组中,根据输入的月份for循环累加,特殊情况判断闰年的情况

源码:

int main()
{
    int year = 0;
    int month = 0;
    int day = 0;
    int sum = 0;
    int num[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    //直接用数组创建,比switch语句简洁了不少
    while(scanf("%d %d %d",&year,&month,&day) != EOF)
    {
        if(year % 400 == 0 || (year % 4 == 0 && year % 100 != 0))
            num[1] = 29;
        //累加月份,这种事就让电脑干
        for(int i = 0;i < month-1;i++)
        {
            sum += num[i];
        }
        sum += day;
        printf("%d\n",sum);
    }

    return 0;
}

四、

题目:

 解答:

\\表示一个 '\' 字符,\123表示一个八进制数,\t 表示水平制表。所以最后的结果是12.

易错点:

 \\ \' \'' \ddd \xhh

以上这几个比较容易出错,需要多加注意

五、

题目:

如下函数f(1)的值是多少

解答:

首先明确i是一个局部变量,此题注意静态局部变量的使用,改变局部变量的销毁时期

static改变了i的生命周期,第一次调用函数:i初值是1,递归第二次调用函数时,i还是第一次那个变量,值已经变成了2,再一次调用函数时i就是3,以此类推

易错点:

不清楚静态局部变量的意义。静态局部变量存储在静态存储区,当静态局部变量离开作用域后,并没有被销毁,被修饰变量的值没有改变,比如本题的i变量的值不会改变,会一直++

六、

题目:

解答:

本题关键在于知道规律后,能够找到第 n 个数据立方的起始奇数,

但我觉得最重要的是如何将一个整型表达式转化为字符串类型

这里需要引用一个新函数sprintf函数,它可以直接将整型类型转换为字符串类型。

sprintf函数的用法

格式化字符串但是不用于打印而是放到一个buf中,所以需要提前创建一个char类型的数组。

可以直接将整型全部转换为字符串类型:

int main()
{
	char buf[100];
	int a = 100;
	int b = 20;
	//sprintf(buf, "%d", a);
	sprintf(buf, "%d+%d", a, b);
	printf("%s", buf);
	return 0;
}

 可以部分转换,以本题举例:

int main()
{
int m;
while(~scanf("%d", &m)){
int start = m * (m - 1) + 1;//找到对应m^3的起始奇数
char buf[10240] = {0};
//sprintf(buf, format, ...) 与printf用法类似,格式化字符串但是不用于打印而是放到一个buf中
sprintf(buf, "%d", start);//先将起始奇数转换成为字符串存入buf中
for (int i = 1; i < m; i++) {
//然后将紧随随后的m-1个奇数数字转换为字符串,按照指定格式放入buf中
//%s+%d, 要求先有一个字符串,然后是+符号,然后是个数字的格式,对应是buf原先的数据,和奇数
sprintf(buf, "%s+%d", buf, start+=2);
}
printf("%s\n", buf);
}
return 0;
}

七、

题目:

若运行以下程序时,从键盘输入 ADescriptor< 回车 > ,则下面程序的运行结果