2017-01-24 2 views
0

Я новичок в программировании, и я взял это как хобби. Поэтому я начал решать упражнение, но моя программа неожиданно аварийно.
Это упражнение:Сбой программы?

Чувствительный Общество Клуб организует пожертвование кампании. Чтобы больше развлечься в кампании, они организуют конкурс среди департаментов. В конкурсе победители пожертвования студенты и отдел награждаются сертификатом.

Вопрос: Напишите программу, которая читает информацию для русских студентов, тогда она показывает имя студента, который пожертвовал большую сумму, и отдел, средний уровень которого является самым высоким.

Ввод спецификации: Вам будет дано целое число (n) в начале. Тогда следующие п строки будут иметь три информации:

Student Имя: имена не более 20 знаков строки, содержащие только 26 букв английского языка (верхний или нижний регистр) его/ее отдел: не более 4 символов длинной строки (только 3 отделения в конкурсе: ЕКС, ЕЭК или BINF)

Выход спецификация: Показать две строки:
на имя студента, который пожертвовал самым,
отдел, средний самый высокий.

int n,i,CENc=0,ECEc=0,BINFc=0,CENa=0,ECEa=0,BINFa=0,amountS,amountH=0,avgCEN,avgECE,avgBINF; 
char department[4],name[20],nameH[20]; 
scanf ("%d",&n); 
for (i=0;i<n;i++);{ 
    gets (name); 
    gets (department); 
    scanf("%d",&amountS); 
    if (strcmp(department,"ECE")==0){ 
     ECEa=ECEa+amountS; 
     ECEc++; 
    } 
    else if (strcmp(department,"CEN")==0){ 
     CENa=CENa+amountS; 
     CENc++; 
    } 
    else if (strcmp(department,"BINF")==0){ 
     BINFa=BINFa+amountS; 
     BINFc++; 
    } 
    if (amountS>amountH){ 
      amountH=amountS; 
      strcpy(nameH,name); 
    } 

} 
avgCEN=CENa/CENc; 
avgECE=ECEa/ECEc; 
avgBINF=BINFa/BINFc; 
if (avgCEN>avgECE && avgCEN>avgBINF){ 
    printf("%d", avgCEN); 
    printf("%s", nameH); 
} 
else if (avgECE>avgCEN && avgECE>avgBINF){ 
    printf("%d", avgECE); 
    printf("%s", nameH); 
} 
else if (avgBINF>avgCEN && avgBINF>avgECE){ 
    printf("%d", avgBINF); 
    printf("%s", nameH); 
} 
    return 0 

Так я знаю, что это немного плохо сделано, но вот проблема.
Ввод первой и второй строк входов Johnny CEN 500Mark BINF 600 и после этого программа вылетает.
Любые мысли о том, почему это происходит? Примечание. Я бы не хотел использовать массивы в это время, поскольку я изучаю основы и постоянно перехожу к более сложным вещам.

+5

Просьба указать [Минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve). Ваш код не может быть скомпилирован как есть, так что людям будет намного сложнее помочь вам. –

+2

'department [4]'. Строки в C содержат терминатор NUL. Так что «BINF» требует 5 «символов» в массиве для хранения. – kaylum

+0

И никогда не используйте 'gets'. Он даже говорит вам, что на странице [получает справочную страницу] (https://linux.die.net/man/3/gets). – kaylum

ответ

0

Вы вводите как второй вход Mark BINF 600, теперь отдел имеет только 4 символа, включая Null Character \0. Поэтому, пожалуйста, измените char department[4] на char department[5].

Также из этого ответа От What does gets() save when it reads just a newline Работает gets().

Эта часть в описании gets может быть запутанным:

Он принимает все символы до (но не включая) символа новой строки

Было бы лучше сказать, что принимает все символы включая the newline но магазины все символы не включая the newline.

Таким образом, если пользователь вводит some string, функция gets прочтет some string и символ новой строки из терминала пользователя, но хранить только some string в буфере - символ новой строки теряется.Это хорошо, потому что никто не хочет символа новой строки в любом случае - это контрольный символ, а не часть данных, которые пользователь хотел ввести.

Поэтому, если вы только нажимаете , введите, gets интерпретирует его как пустую строку.

И так на старте на линии scanf ("%d",&n), когда вы вводите вход и нажмите Enter, символ новой строки сохраняется в буфере так, когда исполнение прибывает на gets (name), gets прочитать символ новой строки и интерпретировать строку как пустые и двигаться вперед, так, чтобы переварить, что символ новой строки вы могли бы хорошо сделать это,

char a ; 
scanf("%d" , &n); 
scanf("%c" , &a); 

так символ новой строки, который присутствует в буфере будет храниться в, и не будет читать по gets.

Также, если вы вводите ввод строки, например Johnny CEN 500, то gets(), вероятно, хранит все это в одной строке, потому что он считает пробел. Так что вы, вероятно, этого не хотите.

Также в этой части кода вы, вероятно, разделяете 0.

avgCEN=CENa/CENc; 
    avgECE=ECEa/ECEc; 
    avgBINF=BINFa/BINFc; 

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

  • Нет связанных вопросов^_^