You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

改用scanf读取变量z后C程序崩溃,求问题排查与解决

解决你的程序崩溃与功能错误问题

让我们一步步排查你代码里的问题,这些问题不仅导致了程序崩溃,还无法实现你要的统计功能:

关键错误点

  • 未初始化的count变量:在functie函数里,count没有初始值就直接进行count=count+1操作,这会触发未定义行为,可能导致程序崩溃或统计结果完全错误。
  • 错误的z读取逻辑:你在main里尝试读取z时用错了函数(fscanf("%d", &z);没有指定文件指针,应该用scanf("%d", &z);从键盘输入),同时functie函数里又重复调用scanf("%d", &z);,这会导致程序额外等待输入,甚至打乱输入流,引发崩溃。
  • 返回值与输出不匹配functie函数返回的是z,但你需要返回的是统计的次数count;而且main里的fprintf(g,"%d %d", functie(v,nr,z));写了两个%d占位符,却只传了一个返回值,这会导致输出错误,甚至程序崩溃。
  • 未检查文件是否成功打开:如果data-in.txt不存在,f=fopen("data-in.txt", "r");会返回NULL,后续的fscanf操作会直接崩溃,必须添加文件打开检查。

修正后的完整代码

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

// 统计z在数组v中出现的次数
int functie(int v[], int nr, int z) {
    int i, count = 0; // 必须初始化count为0
    for(i = 0; i < nr; i++) {
        if(z == v[i]) {
            count++; // 简化写法,和count=count+1等价
        }
    }
    return count; // 返回统计的次数,而不是z
}

int main() {
    int i, nr, z;
    // 从标准输入(键盘)读取z
    printf("请输入z的值:");
    scanf("%d", &z);

    FILE *f = fopen("data-in.txt", "r");
    // 检查文件是否成功打开
    if(f == NULL) {
        printf("无法打开data-in.txt文件!\n");
        return 1; // 异常退出
    }

    fscanf(f, "%d", &nr);
    int *v = malloc(nr * sizeof(int));
    // 检查内存分配是否成功
    if(v == NULL) {
        printf("内存分配失败!\n");
        fclose(f);
        return 1;
    }

    for(i = 0; i < nr; i++) {
        fscanf(f, "%d", &v[i]);
    }

    FILE *g = fopen("data-out.txt", "w");
    if(g == NULL) {
        printf("无法打开data-out.txt文件!\n");
        free(v);
        fclose(f);
        return 1;
    }

    // 输出z和对应的统计次数,这里需要两个参数:z和functie的返回值
    fprintf(g, "%d %d", z, functie(v, nr, z));
    printf("统计完成,结果已写入data-out.txt\n");

    // 释放资源
    fclose(f);
    fclose(g);
    free(v);

    return 0;
}

代码说明

  1. 初始化count:将count初始化为0,确保统计从0开始累加。
  2. 修正z的读取:在main里用scanf从键盘读取zfunctie函数不再重复读取,直接使用传入的z值。
  3. 返回正确的统计结果functie返回count,也就是z出现的次数。
  4. 修复输出格式fprintf传入两个参数z和统计次数,对应两个%d占位符。
  5. 添加错误检查:检查文件打开和内存分配是否成功,避免程序因资源获取失败而崩溃。

测试一下你给的示例:

  • data-in.txt内容:
    4
    1 2 3 3
    
  • 输入z=3,程序会在data-out.txt中写入3 2,完全符合你的需求。

内容的提问来源于stack exchange,提问作者themarksmaker

火山引擎 最新活动