C语言 While循环未执行

inkz8wg9  于 2023-04-19  发布在  其他
关注(0)|答案(1)|浏览(144)

当我运行这个程序时,除了最后的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;
}
kr98yfug

kr98yfug1#

下面的大部分内容已经在评论中提到了。
1.语言规范为main函数指定了两个签名:

int main(void);
int main(int argc, char *argv[]);

对于后者有其他的拼写,但总是选择这两种形式中的一种,至少在你有足够的经验,不再需要关于C基础知识的建议之前。

  • 如果你非常了解这些函数,可以混合使用scanfgetcharfgets。但是如果你非常了解这些函数,那么你就不会经常混合使用它们。一般来说,你应该只选择一个,对于大多数真实世界的程序来说,可能是fgets()。但对于那些不需要对意外或错误输入具有鲁棒性的程序,可能使用scanf()getchar()用于特殊目的。
  • 当你使用scanf()时,它几乎总是错误的,因为它不能检查它的返回值并正确地操作。这将告诉你实际读取了多少输入字段,如果输入不符合预期,它可能比你要求的要少,如果检测到文件结束或I/O错误,它会通知你。
  • isInt()的调用在这里没有意义:
scanf("%d",&s[i].salary);
            sprintf(s2, "%d",s[i].salary);
            if (isInt(s2)) {
                return;
            }

您正在测试的字符串是由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声明。

相关问题