You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C程序在Linux正常运行,Windows下直接结束执行,求助

问题原因与解决方案

核心问题

你的代码在Windows上直接跳转到结束语句的本质原因是**size_t类型与scanf格式符不匹配**:

  • size_t是平台相关的无符号整数类型,Linux(64位)下通常为unsigned long,Windows环境中(尤其是32位编译场景)可能是unsigned int或unsigned long long。
  • 你用对应unsigned int的%u格式符读取size_t变量choice,会导致内存读写不匹配,scanf执行失败后choice的初始值为随机值,大概率超出0-2的范围,直接跳过循环进入程序结束逻辑。

修复方案

有两种简单可靠的修复方式:

方式1:改用匹配的整数类型

将size_t choice替换为unsigned int choice,保持%u格式符不变,确保所有平台上类型与格式符完全匹配:

unsigned int choice; // 替换原size_t类型定义
scanf("%u", &choice);

方式2:使用size_t专用格式符

C99标准提供了%zu格式符专门适配size_t类型,只要你的编译器支持(如GCC、Clang、VS2015及以上版本),可直接修改scanf语句:

scanf("%zu", &choice);

额外优化建议

为避免非法输入导致的程序异常,建议检查scanf的返回值,确保输入读取成功:

if (scanf("%u", &choice) != 1) {
    puts("输入错误,程序退出");
    return 1;
}

修正后的完整代码

#include <stdio.h>

void circumference(int a);
void area(int b);
void volume(int c);

int main(void)
{
    void (*f[3])(int) = {circumference, area, volume};

    printf("Enter 0 to calculate circumference, 1 to calculate area, 2 to calculate volume, and 3 to end: ");
    unsigned int choice;
    if (scanf("%u", &choice) != 1) {
        puts("输入错误,程序退出");
        return 1;
    }
    puts("");

    while (choice >= 0 && choice < 3) {
        if(choice == 0) {
            circumference(choice);
        }
        if(choice == 1) {
            area(choice);
        }
        if(choice == 2) {
            volume(choice);
        }

        puts("");
        printf("Enter 0 to calculate circumference, 1 to calculate area, 2 to calculate volume, and 3 to end: ");
        if (scanf("%u", &choice) != 1) {
            puts("输入错误,程序退出");
            return 1;
        }
        puts("");
    }

    puts("Program execution completed.");
    return 0;
}

void circumference(int a) {
    double radius;
    printf("Please enter a radius: ");
    scanf("%lf", &radius);
    puts("");

    double circumference = 2 * 3.14159 * radius;
    printf("The circumference of a circle is computed.\n");
    printf("       Radius: %lf Circumference: %lf\n", radius, circumference);
    puts("");
}

void area(int b) {
    double radius;
    printf("Please enter a radius: ");
    scanf("%lf", &radius);
    puts("");

    double area =  3.14159 * (radius * radius);
    printf("The area of a circle is computed.\n");
    printf("       Radius: %lf Area: %lf\n", radius, area);
    puts("");
}

void volume(int c) {
    double radius;
    printf("Please enter a radius: ");
    scanf("%lf", &radius);
    puts("");

    double volume = (4.0/3.0) * 3.14159 * (radius * radius * radius);
    printf("The volume of a sphere is computed.\n");
    printf("       Radius: %lf Volume: %lf\n", radius, volume);
    puts("");
}

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 00:48:12