成信大2021自动化专业-平时自主学习-C语言改错题解题参考-整理第01页


第01页

题面如下

在这里插入图片描述

题解如下:

D1.c

原文件

#include<stdio.h>

int main(void)
{
        int xy2;

        /*********Found************/
        scanf("%s", &xy2);
        /*********Found************/
        printf("xy2=%5d\n", &xy2);

	return 0;
}

改后文件

#include<stdio.h>

int main(void)
{
        int xy2;

        /*********Found************/
        scanf("%d", &xy2);
        /*********Found************/
        printf("xy2=%5d\n", xy2);

	return 0;
}

考查要点:

  1. 整数的输入输出格式
  2. 数据在内存上的取值与取址

D2.c

#include<stdio.h>

float fmax(float x, float y);

int main(void)
{
        /*********Found************/
        float l, 1;

        l = 3.0;
        i = 5.6f;
        /*********Found************/
        printf("fmax(%5.2f, %5.2f)=%5.2f\n", i, l, fMax(i, l));

	return 0;
}

/*********Found************/
int fmax(float x, float y)
{
        if (x < y) return y;
        else return x;
}

改后文件

#include<stdio.h>

float fmax(float x, float y);

int main(void)
{
        /*********Found************/
        float l, i;

        l = 3.0;
        i = 5.6f;
        /*********Found************/
        printf("fmax(%5.2f, %5.2f)=%5.2f\n", i, l, fmax(i, l));

	return 0;
}

/*********Found************/
float fmax(float x, float y)
{
        if (x < y) return y;
        else return x;
}

考查要点:

  1. 对字符的敏感性,一眼看出1,l的差别,类似的还有0,o,O的区别
  2. 函数的原型与函数的实现头部是对应一致的:返回类型,函数名,入口参数类型,入参个数,入参顺序

D3.c

#include<stdio.h>

int main(void)
{
        /*********Found************/
        char yy[200] = "ok??\n";

        /*********Found************/
        fol (; *yy; yy++)
        {
                putchar(*yy);
        }

	return 0;
}

改后文件

#include<stdio.h>

int main(void)
{
        /*********Found************/
        char *yy = "ok??\n";

        /*********Found************/
        for (; *yy; yy++)
        {
                putchar(*yy);
        }

	return 0;
}

考查要点:

  1. 关键字for的用法
  2. 字符型数组存字符串的情况,数组名是一个指针,是一个常指针:指向不会发生变化
  3. 按文件要求,改成一个变量指针,指向可以变化,即指针可以移动,从而遍历整个数组,达到输出字符串里的每一个字符的效果

D4.c

#include<stdio.h>

#define PI 3.14
/*********Found************/
#define S(bj) PI*bj*bj

int main(void)
{
        /*********Found************/
        int mianJi;

        mianJi = S(2+3);
        printf("mian ji=%5.2f\n", mianJi);

	return 0;
}

改后文件

#include<stdio.h>

#define PI 3.14
/*********Found************/
#define S(bj) PI*(bj)*(bj)

int main(void)
{
        /*********Found************/
        float mianJi;

        mianJi = S(2+3);
        printf("mian ji=%5.2f\n", mianJi);

	return 0;
}

考查要点:

  1. 宏定义带参数的情况,宏定义是在预编译阶段完成的,带参数时,只是纯粹的替换,不做语法检测,当有参数时,一定要带上括号,否则,表达式逻辑就变了
  2. 对于很多值的计算,要充分估计算出来的值的数据类型,保留应有的精度,整型是无法保证小数的精度的

D5.c

#include<stdio.h>

int main(void)
{
        /*********Found************/
        char yy[100] = "ok??\n",

        /*********Found************/
        prntf("%s", yy);

	return 0;
}

改后文件

#include<stdio.h>

int main(void)
{
        /*********Found************/
        char yy[100] = "ok??\n";

        /*********Found************/
        printf("%s", yy);

	return 0;
}

考查要点:

  1. C程序是由语句构成的,每一条语句,有一个结束标志,即“;”号
  2. C程序的输入输出,没有关键字,是由标准库函数printf来实现的,不能写错

D6.c

#include<stdio.h>

int main(void)
{
        /*********Found************/
        char yy<128>;

        /*********Found************/
        getchar(yy);

        /*********Found************/
        printf("%y", yy);

	return 0;
}

改后文件

#include<stdio.h>

int main(void)
{
        /*********Found************/
        char yy[128];

        /*********Found************/
        gets(yy);

        /*********Found************/
        printf("%s", yy);

	return 0;
}

考查要点:

  1. C的数组的定义是用“[]”,不是“<>”
  2. C的字符串格式化输出,对应的是%s

D7.c

#include<stdio.h>

int main(void)
{
        /*********Found************/
        char x, y;

        x = 39270;
        y = 41001;
        /*********Found************/
        if (x != y)
        {
                printf("x=y");
        }
        /*********Found************/
        else;;
        {
                printf("x<>y\n");
        }

	return 0;
}

改后文件

#include<stdio.h>

int main(void)
{
        /*********Found************/
        int x, y;

        x = 39270;
        y = 41001;
        /*********Found************/
        if (x == y)
        {
                printf("x=y");
        }
        /*********Found************/
        else
        {
                printf("x<>y\n");
        }

	return 0;
}

考查要点:

  1. char可以当成int来用,但值的范围0-255。这里的赋值已经远超出这个范围,应改为int型
  2. 逻辑上,相等使用==
  3. if…else…语句,应使用语句块,不能在后面跟;

D8.c

#include<stdio.h>

int main(void)
{
        FILE *fp;
        /*********Found************/
        char fileName[] = "d:\te.c";

        /*********Found************/
        fp = fopen(fileName, "w");

        /*********Found************/
        if (fp is NULL)
        {
                puts("File Open Error!");
                return 1;
        }
        putchar(fgetc(fp));
        fclose(fp);

	return 0;
}

改后文件

#include<stdio.h>

int main(void)
{
        FILE *fp;
        /*********Found************/
        char fileName[] = "d:\\te.c";

        /*********Found************/
        fp = fopen(fileName, "r");

        /*********Found************/
        if (fp == NULL)
        {
                puts("File Open Error!");
                return 1;
        }
        putchar(fgetc(fp));
        fclose(fp);

	return 0;
}

考查要点:

  1. 在C语言中,字符串里的字符,用到\时,它有转义的作用,所以,如果要用\本身,需要转义,即\
  2. 读文件时,文件的打开mode应为"r"
  3. 判断文件指针是否指向文件时,使用fp == NULL

D9.c

#include<stdio.h>
#include<stdlib.h>

int main(void)
{
        /*********Found************/
        char pch[2];

        /*********Found************/
        if (pch = (char *)malloc(100) == NULL)
        {
                printf("malloc memory fail!\n");
                return 1;
        }
        printf("%p\n", pch);

        /*********Found************/
        close(pch);

	return 0;
}

改后文件

#include<stdio.h>
#include<stdlib.h>

int main(void)
{
        /*********Found************/
        char *pch;

        /*********Found************/
        if ((pch = (char *)malloc(100)) == NULL)
        {
                printf("malloc memory fail!\n");
                return 1;
        }
        printf("%p\n", pch);

        /*********Found************/
        free(pch);

	return 0;
}

考查要点:

  1. 直接开内存时,应使用指针指向开辟的内存的首地址,以方便后续使用和操作这一块内存空间,需要定义相应的指针
  2. 注意运算符号的优先级,是先完成指向,再判断指向是不是成功
  3. 释放内存时,使用free(),而不是close(),没有close()的说法

D10.c

#include<stdio.h>

/*********Found************/
#define START
/*********Found************/
#define NEXT

int main(void)
{
        char *str2 = "13125176247";
        const int i = 0;

        for (printf("\n"); str2[i]; )
        START
                putchar(str2[i]);
                /*********Found************/
                i++;
        NEXT

	return 0;
}

改后文件

#include<stdio.h>

/*********Found************/
#define START {
/*********Found************/
#define NEXT }

int main(void)
{
        char *str2 = "13125176247";
        const int i = 0;

        for (printf("\n"); str2[i]; )
        START
                putchar(str2[i]);
                /*********Found************/
                str2++;
        NEXT

	return 0;
}

考查要点:

  1. 宏定义是硬替换,要给出替换的内容
  2. 常量i里的值不会变化,只有指针来移动了
  3. 通过str2指针的移动,遍历整个字符串,从而打印这个串里的每一个字符
  • 12
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值