2302_79933334 2024-04-16 20:09 采纳率: 81.3%
浏览 2

scanf读入字符串时产生的问题

为什么第一种读入方式不会出现测试点的段错误,而第二种一起写会出现段错误

img

img

  • 写回答

7条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-16 20:09
    关注

    引自免费微信小程序:皆我百晓生

    在您的代码示例中,出现了两种不同的方式来读取字符串和浮点数。让我们逐一分析这两种情况。

    第一种方式:

    #include <stdio.h>
    
    struct zhiyuan {
        char name[10];
        double jiben;
        double fudong;
        double zhichu;
        double shifa;
    };
    
    int main() {
        int n;
        scanf("%d", &n);
    
        struct zhiyuan zhiyuan[n];
    
        for (int i = 0; i < n; i++) {
            scanf("%s", zhiyuan[i].name);
            scanf("%lf", &zhiyuan[i].jiben);
            scanf("%lf", &zhiyuan[i].fudong);
            scanf("%lf", &zhiyuan[i].zhichu);
            
            zhiyuan[i].shifa = zhiyuan[i].jiben + zhiyuan[i].fudong - zhiyuan[i].zhichu;
    
            printf("%s %.2lf\n", zhiyuan[i].name, zhiyuan[i].shifa);
        }
    
        return 0;
    }
    

    第二种方式:

    #include <stdio.h>
    
    struct zyz {
        char a[10];
        double jiben;
        double fudong;
        double zhichu;
        double shifa;
    };
    
    int main() {
        int n;
        scanf("%d", &n);
    
        struct zyz z[110]; // 注意这里定义了一个大小固定的数组
    
        for (int i = 0; i < n; i++) {
            scanf("%s %lf %lf %lf", z[i].a, &z[i].jiben, &z[i].fudong, &z[i].zhichu);
            z[i].shifa = z[i].jiben + z[i].fudong - z[i].zhichu;
    
            printf("%s %.2lf\n", z[i].a, z[i].shifa);
        }
    
        return 0;
    }
    

    对于第一种方式,您动态分配了zhiyuan数组,其大小根据用户输入的员工数量n来决定。由于您已经正确地为每个员工创建了一个结构体对象,因此不会发生段错误,因为内存分配是正确的。

    然而,在第二种方式中,您使用了固定大小的数组z[110],这意味着无论用户输入多少员工信息,数组的大小都是固定的。当用户输入的员工数量超过110时,scanf函数会尝试写入超出数组界限的位置,导致未定义行为,进而可能引发段错误。这是因为数组大小是硬编码的,没有适应性,这可能导致覆盖其他变量的内存空间。

    为了避免这种错误,您可以考虑使用动态内存分配,就像在第一种方法中那样,或者确保您的固定数组足够大,以容纳所有可能出现的员工数量。如果数组大小是固定的,您应该在读取员工信息之前检查用户输入的员工数量是否超过了数组的最大容量,并在必要时提供适当的错误处理。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月16日

悬赏问题

  • ¥15 WPF动态创建页面内容
  • ¥15 如何对TBSS的结果进行统计学的分析已完成置换检验,如何在最终的TBSS输出结果提取除具体值及如何做进一步相关性分析
  • ¥15 SQL数据库操作问题
  • ¥100 关于lm339比较电路出现的问题
  • ¥15 Matlab安装yalmip和cplex功能安装失败
  • ¥15 加装宝马安卓中控改变开机画面
  • ¥15 STK安装问题问问大家,这种情况应该怎么办
  • ¥15 关于罗技鼠标宏lua文件的问题
  • ¥15 halcon ocr mlp 识别问题
  • ¥15 已知曲线满足正余弦函数,根据其峰值,还原出整条曲线