栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言改错题系列整理-非常容易0x1

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言改错题系列整理-非常容易0x1

1 求2/1,3/2,5/3,8/5,13/8,21/13,…前20项之和。

请改正程序中的错误,使它能得出正确的结果。

#include 

main()
{
    int i, s1 = 2, s2 = 1;
    float x, sum = 0;

    for (i = 1; i <= 20; i++)
    {
        sum += s1 / s2;
        x = s1;
        s1 += s2;
        s2 = x;
    }
    printf("sum = %9.6fn", sum);
}

答案

很简单 s1,s2都是int类型,int类型的除法是整除得到还是int类型我们只需要使用强转即可

#include 

main()
{
    int i, s1 = 2, s2 = 1;
    float x, sum = 0;

    for (i = 1; i <= 20; i++)
    {
        sum += (float)s1 / s2;   //错误1
        x = s1;
        s1 += s2;
        s2 = x;
    }
    printf("sum = %9.6fn", sum);
}
2 奥运参赛国出场次序:

输入奥运会参赛国国名,并按照字典序对其进行排序。
要求:参赛国数量不超过150个,每个国家的名字不超过9个字符。
提示:‘’占一个字符。
要求:请找出下面程序的错误并改正。

#include 
#include 
 
#define N 150
#define MAX_LEN 10
void SortString(char str[][MAX_LEN], int n);
 
int main()
{
    int i, n;
    char name[N][MAX_LEN]; 
 
    printf("How many countries?");
    scanf("%d",&n);     
    getchar();
    printf("Input their namesn");
 
    for(i=0;i 

答案

一开始以为错是 数组char str[][MAX_LEN] ,但其实并不是

https://blog.csdn.net/jeffscott/article/details/79017571
可以用二维数组名作为实参或者形参,在被调用函数中对形参数组定义时可以指定所有维数的大小,也可以省略第一维的大小说明,但不可以省略第二位或更高维如:
void Func(int array[ ][ ]) 错误
void Func(int array[3][10]) 正确
void Func(int array[][10]) 正确

后面是字符串对比上面出了问题,不能简单的相减比较

#include 
#include 
 
#define N 150
#define MAX_LEN 10
void SortString(char str[][MAX_LEN], int n);
 
int main()
{
    int i, n;
    char name[N][MAX_LEN]; 
 
    printf("How many countries?");
    scanf("%d",&n);     
    getchar();
    printf("Input their namesn");
 
    for(i=0;i 0)        //错误 字符串比较
            {
                strcpy(temp,str[i]);
                strcpy(str[i],str[j]);
                strcpy(str[j],temp);
            }
        }
    }
}
3 下面程序的功能是将数组元素逆序输出 ,找出其中的错误并改正之。
#include "stdio.h"
#define M 5 
int main()
{   int a[M]={1,2,3,4,5};
    int i;
    for(i=M;i>=1;i--)
         printf("%d ",(a+i));
    return 0;
}

答案

三处地方一、循环部分发生了越界二、数组a[M]里面,a 表示数组a地址,a+i 代表a[i]的地址,我们要输出a[i],就得在地址前面加 *访问地址得到数据三、差点漏了#include "stdio.h"

#include                  //错误3
#define M 5
int main()
{
    int a[M] = {1, 2, 3, 4, 5};
    int i;
    for (i = M - 1; i >= 0; i--)  //错误1
        printf("%d ", *(a + i));   //错误2
    return 0;
}
4 下面程序的功能是删除字符串中第一次出现的a字符。

其中有两处错误,请改正并使程序正确执行。

#include 
#include 
void fun(char *s,int n,int *t)
{
    int i,k=0;
    s[n]='a';
    s[n+1]='';
    while(s[k]!='a') k++;
    if(k==n){*t=0;}
    else
    {
        for(i=k;i 

答案

一、看函数void fun(char *s,int n,int *t) 注意参数t是指针,我们需要把int类型的数据的地址传给指针二、循环越界问题,长度为n的字符串经过函数有可能变成长度为n-1的字符串,所以要注意越界的问题

#include 
#include 
void fun(char *s,int n,int *t)
{
    int i,k=0;
    s[n]='a';
    s[n+1]='';
    while(s[k]!='a') k++;
    if(k==n){*t=0;}
    else
    {
        for(i=k;i 
5 判断输入的三个数是否相等。 

算法如下,请改正程序中的错误,使它能得出正确的结果。

#include 
 
main()
{
    int a, b, c;
 
    scanf("%d,%d,%d", a, b, c);
    if (a = = b = = c)
        printf("The three number is equal!!!");
    else
        printf("The three number isn't equal!!!");
}

答案

一、scanf注意后面参数是赋给地址二、不存在三元符 == ==,需要分开 利用上逻辑符号&&

#include 
 
main()
{
    int a, b, c;
 
    scanf("%d,%d,%d", &a, &b, &c);   //错误1
    if (a == b &&  b == c)  //错误2
        printf("The three number is equal!!!");
    else
        printf("The three number isn't equal!!!");
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/766670.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号