Как исправить ошибку сегментации в цикле Do - PullRequest
0 голосов
/ 22 июня 2019

Я пишу программу, которая принимает ID сотрудника из 4 цифр, общее количество рабочих часов за месяц и сумму, которую он получает за час.Ожидаемый результат - распечатать ID сотрудника и зарплату (с двумя десятичными разрядами) определенного месяца.

#include <stdio.h>
#include <stdlib.h>

int main()
{
   int id, workedHours;
   float payHour, payMonth;

   do
   {
      printf("Please enter your ID: ");
       scanf("%d", &id);
  }
   while (strlen(id) != 4);

  printf("Please enter your worked hours: ");
  scanf("%d", &workedHours);
  printf("Please enter the amount you received per hour: $");
  scanf("%f", &payHour);

  payMonth = payHour * workedHours;

  printf("ID: %d\n", id);
  printf("Salary: $%.2f\n", payMonth);
  return(0);
}

1 Ответ

0 голосов
/ 22 июня 2019

Один из вариантов - использовать спецификатор %n для записи количества символов, обработанных при сканировании. Строка формата " %n%d%n" пропустит любой начальный пробел, запишет количество символов, обработанных до этой точки, отсканирует int и снова запишет количество обработанных символов.
scanf для одного элемента может возвращать 1 (успех), 0 (невозможно проанализировать значение) или EOF (конец файла). Если возвращаемое значение равно 0, ввод должен быть очищен от ожидающих символов.

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int id, workedHours;
    int first = 0;
    int last = 0;
    int result = 0;
    float payHour, payMonth;

    do
    {
        printf("Please enter your ID: ");
        fflush ( stdout);
        result = scanf ( " %n%d%n", &first, &id, &last);
        if ( result == EOF)
        {
            return 0;
        }
        if ( result == 0)
        {
            while ( getchar ( ) != '\n')
            {
                //clean input
            }
        }
    }
    while ( result != 1 || last - first != 4);

    do
    {
        printf("Please enter your worked hours: ");
        fflush ( stdout);
        result = scanf("%d", &workedHours);
        if ( result == EOF)
        {
            return 0;
        }
        if ( result == 0)
        {
            while ( getchar ( ) != '\n')
            {
                //clean input
            }
        }
    }
    while ( result != 1);

    do
    {
        printf("Please enter the amount you received per hour: $");
        fflush ( stdout);
        result = scanf("%f", &payHour);
        if ( result == EOF)
        {
            return 0;
        }
        if ( result == 0)
        {
            while ( getchar ( ) != '\n')
            {
                //clean input
            }
        }
    }
    while ( result != 1);

    payMonth = payHour * workedHours;

    printf("ID: %04d\n", id);
    printf("Salary: $%.2f\n", payMonth);

    return(0);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...