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
相关产品推荐
相关产品推荐

