2015-11-03 3 views
0

Я изучаю программирование на С! Я пытаюсь написать программу , но некоторые вещи не работают так, как должны! Вот код, и я объясню ниже!Несколько символов не печатаются

#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_in и surn_in. Я не могу найти решение, вы можете мне помочь?

PS. Я кодирую в Visual Studio

+0

Почему эти 'getchar();' s находятся между 'scanf's? Это проблема. –

+0

и 'fflush (stdin);' UB. –

+0

Я имел обыкновение иметь fflush (stdin) между ними, но что-то не так происходит, поэтому я случайно помещал их, и это сработало: p – cntovas

ответ

3

afm > 9999999999 всегда неверно для int afm. На вашей платформе int и long имеют длину 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) 
+0

Я понимаю ошибку, но почему она все еще работает? – cntovas

+0

Он может * работать *, потому что это то, что делает ваша платформа.В стандарте говорится, что он вызывает неопределенное поведение, поэтому все идет. Просто имейте в виду, что он может упасть на другую ОС. – chqrlie

+0

да, это доход: p переменные должны быть в греческом письме с английскими буквами: p – cntovas

2

Вы пропустили нужный getchar() перед тем, как вы сканируете name_in. В противном случае он считывает последнюю строку новой строки. Эффекты распространяются и на surn_in.

FWIW, fflush(stdin) - неопределенное поведение. Избавься от этого.

+0

Я бы тоже избавился от 'getchars'. 'scanf' может выполнить эту работу. –

+0

@EugeneSh. наверняка. многие способы достижения. :) –

+0

спасибо, сэр и все остальные! – cntovas

Смежные вопросы