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

C语言代码段错误且if-else无法输出,求排查解决

C编程段错误与输出异常问题解决

问题概述

作为C编程新手,我编写的代码出现Segmentation fault(段错误),导致指定的printf语句无法输出。尝试修改scanf("%c \n",proceed);为%d后代码可运行,但if-else语句内的输出仍然不显示。

原出错的printf代码块:

printf(" Name: %s \n",name);
printf("IC: %s \n",nic);
printf("Category: %s \n",category);
printf("Total hours: %d \n",totalhours);
printf("Gross: %d \n",gross);
printf("Overtime: %d \n",overtime);
printf("Netpay: %d \n",netpay);

完整原代码:

#include <stdio.h>

int main() {
    char proceed='Y';
    char name[50];
    char nic[50];
    char category[50];
    int totalhours;
    double bal;
    double gross;
    double overtime;
    double netpay;

    while(proceed=='Y'){
        printf("Name:");
        scanf("%s",&name);
        printf("IC:");
        scanf("%s",&nic);
        printf("Category:");
        scanf("%s",&category);
        printf("Total Hours:");
        scanf("%d",&totalhours);

        printf("Hello World SDN BHD\n");
        printf("=======\n");

         if(totalhours<=60 && category=="E1"){
             
            if(totalhours>=40){
                bal=totalhours-40;
                gross=40*100;
                overtime=(1.5*100)*bal;
                netpay=gross+overtime;
            }
            else{
                bal=0;
                gross=40*100;
                overtime=0;
                netpay=gross+overtime;
            }
            
            printf(" Name: %s \n",name);
            printf("IC: %s \n",nic);
            printf("Category: %s \n",category);
            printf("Total hours: %d \n",totalhours);
            printf("Gross: %d \n",gross);
            printf("Overtime: %d \n",overtime);
            printf("Netpay: %d \n",netpay);
        }
        
        printf("Cont?:");
        scanf("%c \n",proceed); 
    }
return 0;
}

错误原因与修复方案

1. 段错误的直接原因:scanf字符串参数错误

scanf("%s",&name);中,name是数组名,本身就是指向数组首元素的指针(char*类型),不需要加&。加&后传递的是数组的地址(char(*)[50]类型),与scanf("%s")要求的char*类型不匹配,导致内存访问错误,触发段错误。

修复: 去掉字符串scanf中的&,改为:

scanf("%s", name);
scanf("%s", nic);
scanf("%s", category);

2. if语句不执行:字符串比较错误

category=="E1"是比较两个指针的地址,而非字符串内容。category是数组首地址,"E1"是字符串常量的地址,两者永远不相等,导致if条件始终为假。

修复: 使用C标准库的strcmp函数比较字符串,需要包含<string.h>头文件:

#include <string.h>
// ...
if(totalhours<=60 && strcmp(category, "E1") == 0)

3. char类型scanf的输入问题

scanf("%c \n",proceed);存在两个问题:

  • 没有传递变量地址,应该用&proceed;
  • 之前的scanf("%d")会在输入缓冲区留下换行符,导致%c直接读取换行符,无法获取用户输入的Y/N。

修复: 在%c前加空格跳过空白字符,同时传递地址:

scanf(" %c", &proceed);

4. printf格式符不匹配

gross、overtime、netpay是double类型,使用%d(整数格式符)会导致输出错误,甚至可能引发异常。

修复: 改用%lf(或%f,printf中两者均可)输出double类型:

printf("Gross: %lf \n",gross);
printf("Overtime: %lf \n",overtime);
printf("Netpay: %lf \n",netpay);

完整修复后的代码

#include <stdio.h>
#include <string.h>

int main() {
    char proceed='Y';
    char name[50];
    char nic[50];
    char category[50];
    int totalhours;
    double bal;
    double gross;
    double overtime;
    double netpay;

    while(proceed=='Y' || proceed=='y'){ // 支持小写y输入
        printf("Name: ");
        scanf("%s", name);
        printf("IC: ");
        scanf("%s", nic);
        printf("Category: ");
        scanf("%s", category);
        printf("Total Hours: ");
        scanf("%d", &totalhours);

        printf("\nHello World SDN BHD\n");
        printf("=======\n");

         if(totalhours<=60 && strcmp(category, "E1") == 0){
             
            if(totalhours>=40){
                bal=totalhours-40;
                gross=40*100.0; // 用浮点运算避免整数截断
                overtime=(1.5*100.0)*bal;
                netpay=gross+overtime;
            }
            else{
                bal=0;
                gross=totalhours*100.0; // 修复原逻辑错误:未到40小时按实际工时计算薪资
                overtime=0;
                netpay=gross+overtime;
            }
            
            printf(" Name: %s \n", name);
            printf("IC: %s \n", nic);
            printf("Category: %s \n", category);
            printf("Total hours: %d \n", totalhours);
            printf("Gross: %lf \n", gross);
            printf("Overtime: %lf \n", overtime);
            printf("Netpay: %lf \n", netpay);
        }
        else {
            printf("不符合E1类别或工时超过60小时,无法计算薪资\n");
        }
        
        printf("\nCont? (Y/N): ");
        scanf(" %c", &proceed); 
    }
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 09:59:58