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

