几个字符不打印

时间:2015-11-03 19:56:50

标签: c visual-studio char scanf

我正在学习C编程!我正在尝试编写一个程序 但是有些东西不能正常工作! 这是代码,我将在下面解释!

 #include <stdio.h>
#define _CRT_SECURE_NO_WARNINGS


int main(void)
{
    int afm, date, month, year,code;
    char name_in, surn_in, slash, category;
    float income, tax;
    do {
        printf("Give afm : "); /*Give a 10 digit number*/
        scanf("%d", &afm);
        if (afm < 1000000000 || afm > 9999999999) {
            printf("Incorrect!\n");
        }
    } while (afm < 1000000000 || afm > 9999999999);
        fflush(stdin);
        printf("Give your name's first letter: ");
        scanf("%c", &name_in);
        getchar();
        printf("Give surname's first letter: ");
        scanf("%c", &surn_in);
        getchar();

    do
        {
        printf("Date of birth(must be at least 18) : ");
        scanf("%d%c%d%c%d", &date, &slash, &mhnas, &slash, &etos); /*just write 20/10/1987 */
        if (month < 1 || month>12) {
            printf("Incorrect month. \n");
        }
        if (year > 1997) {
            printf("Year incorrect \n");
        if (2015 - year == 18 && month==12 ) {
            printf("Incorrect date of birth.\n");

            }
        }
    } while ((month < 1 || month>12) || (year > 1997) || (2015 - year == 18 && mhnas == 12));
    printf("Add your income ");
    scanf("%f", &income);

    code = afm % 10; /*need to find the afm's last digit*/

    if (code == 1 || code == 2 || code == 3) {
        category = "Misthwtos";
        if (income <= 10000) {
            tax = 0;
        }
        if (income > 10000 && income <= 30000) {
            tax = (eisodhma - 10000) * 20 / 100;
        }
        if (income > 30000)
            tax = (20000 * 20 / 100) + ((eisodhma - 30000) * 30 / 100);
    }

    if (code != 1 || code != 2 || code != 3) {
        tax = income * 30 / 100;
    }

    printf("Info: \n");
    printf("%d %c.%c. &d/%d/%d",afm, name_in, surn_in, date, month, year);


    system("pause");
    return 0;
}

所以,问题在于,当程序在代码末尾打印出我要求的内容时,它会打印除name_insurn_in之外的所有内容。我无法找到解决方案,你能帮助我吗?

PS。我在Visual Studio中编码

2 个答案:

答案 0 :(得分:3)

对于afm > 9999999999

int afm始终为false。在您的平台上,intlong长度为32位,因此限制为小于2147483647的值。

您应该对这些变量使用类型long long

使用scanf格式%lld

解析它们

fflush(stdin);调用未定义的行为。你可能想要摆脱用户面前的任何类型:这不能在C中移植,并且无论如何都是值得怀疑的。

tax = (eisodhma - 10000) * 20 / 100;指的是未定义的变量。您的意思是tax = (income - 10000) * 20 / 100;吗?

scanf("%c", &name_in);不读取下一个字符,它读取标准输入中缓冲的'\n'。要跳过空格,chux建议这个简单的修复:

scanf(" %c", &name_in);

最重要的是:

if (code != 1 || code != 2 || code != 3)

总是如此。你的意思是:

if (code != 1 && code != 2 && code != 3)

答案 1 :(得分:2)

在您扫描getchar()之前,您错过了必需的name_in。否则,它会读取最后一个换行符。效果也会传播surn_in

FWIW,fflush(stdin)是未定义的行为。摆脱它。