Сканирование одного символа C - PullRequest
0 голосов
/ 24 февраля 2011
/*
Program to calculate trip and plan flights
*/
#define TRIP 6
#define DEST 1
#include <stdio.h>

int error_dest(int type_num, int cont_num, int dest_code, int check);


int main(void)
{
  int check, type_num, cont_num, index, i, dest_code, trip_num, row, col;
  int travelint[TRIP][DEST], travelarea[TRIP];
  char area_code, S, M, L, N, P, K, R, C, U, W, O;

  trip_num = 7;
  while (trip_num > TRIP)
  {
    printf("Please enter the number of trips:");
    scanf("%d", &trip_num);
    if ( trip_num < TRIP)
    { 
      printf("Valid trip number. Please proceed to enter destination code.\n");
    }
    else
    {
      printf("Invalid trips. Please enter no more then 6 trips.\n");
    }
  }

  /*********************************************************************************/

  for (i=0; i < trip_num ; i++)  /*destination code input*/
  {   
    printf("Please enter destination code:");
    scanf("%d", &dest_code);                   /*input of destination code*/
    check = error_dest(type_num, cont_num, dest_code, check);
    if (check == 2)
    { travelint[i][0]=dest_code; }
    else
    {
      while (check == 1)
      {
        printf("Please enter destination code:");
        scanf("%d", &dest_code);                   /*input of destination code*/
        check = error_dest(type_num, cont_num, dest_code, check);
        if (check == 2)
        { travelint[i][0]=dest_code; }

      }
    }
    printf("Please select from the following that best describes your destination:\n");
    printf("S Small city - population under 50,000\n");
    printf("M Medium city - population between 50,000 and 500,000\n");
    printf("L Large city - pop. over 500,000\n");
    printf("N Natural formation like a mountain, a lake, a cave, a geyser, a fjord, a canyon, etc.\n");
    printf("P Designated park or reserve such as a wildlife refuge, a national park, a bioreserve, or a protected marine area\n");
    printf("K Man made landmark like the Great Wall of China, the Taj Mahal, or Stonehenge\n");
    printf("R State or province or region of a country\n");
    printf("C Whole country\n");
    printf("U Multiple countries like traveling through Europe\n");
    printf("W Ocean voyage\n");
    printf("O Any other type of destination - such as visiting the sites of the seven wonders of the world\n");
    printf("Please enter the Area Letter code:");
    scanf("%c", &area_code);       

  }
  /*******************************************************************************/

  /*print for destination_code*/

  for (row = 0; row < trip_num; row++)
  {
    for (col=0; col < DEST; col++)
      printf("Trip[%d] = %d\n", row+1, travelint[row][col]);
  }

  return 0;  

}

error_dest(type_num, cont_num, dest_code, check)
{   
  cont_num = dest_code / 10000;             /*math for error check*/
  type_num = dest_code/1000 - cont_num*10;  

  if ( (cont_num <= 7) && (cont_num > 0) &&  (type_num <= 5) && (type_num >=0) )
  { /* loop for checking destination code*/
    check = 2 ;
    return check;
  }
  else
  {
    printf("%d is a invalid code\n", dest_code);
    check = 1;
    return check;
  }
}

по какой-то странной причине в scanf ("% c", & area_code);он просто запускается вперед и печатает массив dest_code, не позволяя мне вводить какой-либо символ, и я не уверен, что именно я делаю неправильно.

Ответы [ 6 ]

3 голосов
/ 24 февраля 2011

Если вы хотите получить только один символ, возможно, было бы лучше использовать getchar () вместо scanf ()?

1 голос
/ 24 февраля 2011

В основном происходит следующее: вы выводите на экран сообщение «Пожалуйста, введите количество поездок».Пользователь вводит 4, а затем нажимает клавишу ввода, что означает, что буфер stdin выглядит так: «4 \ n».Затем вы вызываете scanf со строкой формата "% d".scanf смотрит на буфер stdin и видит 4. Он смотрит на следующий символ, который является символом новой строки, и видит, что он не является частью числа (как указывает% d), поэтому он выполнил форматстрока и оставляет указатель файла на новой строке.Он преобразует символ '4' в целое число 4, помещает его в trip_num и возвращает.

При следующем вызове scanf он начинает с того места, где остановился на новой строке.Строка формата на этот раз "% c", поэтому она просто берет следующий символ из буфера, который в настоящее время является новой строкой ("\ n"), помещает его в dest_code и возвращает.Если вы хотите, чтобы в этом случае функция scanf пропускала пропуски, вы должны явно указать это, добавив пробел перед форматом "% c" для второго scanf (код назначения).Затем scanf будет пропускать все пробельные символы (включая эту новую строку), пока не встретит непробельный символ, который он помещает в dest_code.

TL; DR: Измените второй scanf вызов на scanf(" %c", &dest_code).И исправьте другие ошибки, на которые указывали другие, чтобы другие ошибки не появлялись.

1 голос
/ 24 февраля 2011

Вы можете напечатать area_code после сканирования, я думаю, это может быть '\ n', который является последним символом строки dest_code, которую вы ввели.

0 голосов
/ 23 октября 2014

Используйте " fflush (stdin) " перед вводом символа, т.е. перед оператором " printf " для символа. Он очистит входной буфер и, таким образом, вы сможете отсканировать нужный символ .Или просто введите Пробел перед командой "% c ".Как ---------- scanf ("% c", & код_области); ---------------

0 голосов
/ 24 февраля 2011

Это может или не может помочь, но ранее было сказано, что вам, вероятно, нужно поместить getchar () в цикл while.Вам также могут понадобиться fgets для захвата ввода с клавиатуры.

while (1) {

 printf("Enter Message Type:");
 fflush(stdout) ;

//    scan msg.hdr from received message.
 scanf("%d", &(msg.m_hdr));
 while(getchar() != '\n'){}  

printf("Enter your Message:");
fflush(stdout);

// grab data from keyboard
fgets(msg.m_data, sizeof(msg.m_data), stdin);
0 голосов
/ 24 февраля 2011

Вы должны очистить буфер перед чтением символа из stdin:

int c = 0;
while (c != '\n' && c != EOF)
{
    c = getchar();
}

тогда вы можете прочитать своего персонажа, используя scanf или заменить его на getchar.

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