当我运行这个程序时,除了最后的while循环块之外,所有内容都被执行。任何帮助都将非常感谢。如果基本工资中的输入不是整数,但while循环没有执行,程序应该打印无效。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdbool.h>
bool isInt(char *salary) {
int i = 0;
if (salary[0] == '-') {
i = 1;
}
for (; i < strlen(salary); i++) {
if (salary[i] < '0' || salary[i] > '9') {
return false;
}
}
return true;
}
struct employee
{
char name[100];
char hdate[100];
int salary;
};
int calc(int a);
void main(){
int j,i;
char s2[100];
printf("enter number of employees: ");
scanf("%d",&j);
struct employee s[j];
printf("\nEnter details of employees: \n\n");
getchar();
for (i=0;i<j;i++){
int n=2;
printf("Name: ");
fgets(s[i].name,sizeof(s[i].name),stdin);
s[i].name[strcspn(s[i].name, "\n")] = '\0';
printf("Hire Date: ");
fgets(s[i].hdate,sizeof(s[i].hdate),stdin);
s[i].hdate[strcspn(s[i].hdate, "\n")] = '\0';
while (n>1)
{
printf("Base Salary: ");
scanf("%d",&s[i].salary);
sprintf(s2, "%d",s[i].salary);
if (isInt(s2)) {
return;
}
else {
printf("Invalid ,Enter a valid Input \n");
}
}
}
printf("Employee and Salary table\n");
printf("-----------------------------------------------------\n");
printf("Name\t\t\tHire Date\t\t\tBase Salary\n\n");
for (i = 0; i <j; i++)
{
printf("%s\t\t\t%s\t\t\t%d\n",s[i].name,s[i].hdate,s[i].salary);
printf("\nCalculations: \n");
calc(s[i].salary);
printf("-----------------------------------------\n");
}
}
int calc(int a){
int hra,da,ta,gs,pf,it,ns;
hra=(24*a)/100;
da=(15*a)/100;ta=4000;gs=a+hra+da+ta;
pf=(10*a)/100;it=(5*a)/100;
ns=gs-pf-it;
printf("\n\tBasic Salary: %d \n\tHRA: %d \n\tDA: %d \n\tTA: %d \n\tGross Salary: %d \n\tPF: %d \n\tIncome Tax: %d \n\tNet Salary: %d\n\n",a,hra,da,ta,gs,pf,it,ns);
return 0;
}
1条答案
按热度按时间kr98yfug1#
下面的大部分内容已经在评论中提到了。
1.语言规范为
main
函数指定了两个签名:对于后者有其他的拼写,但总是选择这两种形式中的一种,至少在你有足够的经验,不再需要关于C基础知识的建议之前。
scanf
,getchar
和fgets
。但是如果你非常了解这些函数,那么你就不会经常混合使用它们。一般来说,你应该只选择一个,对于大多数真实世界的程序来说,可能是fgets()
。但对于那些不需要对意外或错误输入具有鲁棒性的程序,可能使用scanf()
。getchar()
用于特殊目的。scanf()
时,它几乎总是错误的,因为它不能检查它的返回值并正确地操作。这将告诉你实际读取了多少输入字段,如果输入不符合预期,它可能比你要求的要少,如果检测到文件结束或I/O错误,它会通知你。isInt()
的调用在这里没有意义:您正在测试的字符串是由
sprintf()
化的,所以如果它不能作为整数进行验证,那么您就有了isInt()
无法解决的非常严重的问题。如果您在尝试解析整数之前通过
fgets()
阅读一整行来验证该行,这可能是有意义的,但实际上更容易检测到无效输入作为解析的副作用(例如,使用strtol()
)。while (n>1)
循环永远不会正常终止,因为n
从2开始,并且在循环体中不会改变。如果你有意编写一个无限循环,那么通过拼写while (1)
或for (;;)
来明确这一点。另一方面,如果你想限制重试次数,那么n
while
循环中的return
终止了main()
的执行。除非用户输入1或更多的雇员数量,否则return
将中断外部for
循环的第一次迭代,这就是为什么您的程序永远不会打印工资表。可能您想要在这里使用break
而不是return
,但也见上文。main()
first,前面有它可能想要调用的任何函数的前向声明,或
main()
last,由于main()
之前的所有函数定义,因此不需要forward声明。