2015-10-29 3 views
-3

Мне нужно написать программу на C, которая позволит пользователю нарисовать квадрат прямоугольника или распечатать правление, которое он сделал, но каждый раз после первого ввода формы программа действует так, как если бы он ввел недействительный персонаж.scanf читает неправильный символ

printf("please make you decision R-rectangle, S-square, E-end\n"); 
scanf("%c", &decision); 
do 
{ 
    if (decision == 'R') { 
     printf("you chose rectangle! please enter the X start position, Y start position, hieght and width\n"); 
     scanf("%d %d %d %d", &rectMat[0][rectCounter], &rectMat[1][rectCounter], &rectMat[2][rectCounter], &rectMat[3][rectCounter]); 
     if (rectCounter + 1 < MAX_RECT) 
     { 
      if (checkRECT(rectMat[0][rectCounter], rectMat[1][rectCounter], rectMat[2][rectCounter], rectMat[3][rectCounter], areaMat) == 1) 
      { 
       drawRECT(rectMat[0][rectCounter], rectMat[1][rectCounter], rectMat[2][rectCounter], rectMat[3][rectCounter], areaMat); 
       rectCounter++; 
      } 
      else 
      { 
       printf("we couldn't fit you rectangle\n"); 
      } 
     } 
     else 
     { 
      printf("you have too many rectangles\n"); 
     } 
    } 

    if (decision == 'S') 
    { 
     printf("you chose square! please enter the X start position, Y start position and size of the side\n"); 
     scanf("%d %d %d", &sqrMat[0][rectCounter], &sqrMat[1][rectCounter], &sqrMat[2][rectCounter]); 
     if (sqrCounter<MAX_SQR) 
     { 
      if (checkSQR(sqrMat[0][rectCounter], sqrMat[1][rectCounter], sqrMat[2][rectCounter],areaMat)==1) 
      { 
       drawSQR(sqrMat[0][rectCounter], sqrMat[1][rectCounter], sqrMat[2][rectCounter], areaMat); 
       sqrCounter++; 
      } 
      else 
      { 
       printf("we couldn't fit your square\n"); 
      } 
     } 
     else 
     { 
      printf("you have too many sqaures\n"); 
     } 
    } 
    if (decision == 'P') 
    { 
     printArea(areaMat); 
    } 
    if (decision != 'E'&& decision != 'P'&& decision != 'S'&& decision != 'R') 
    { 
     printf("invalid entry\n"); 
    } 
    printf("please make you decision R-rectangle, S-square, E-end\n"); 
    scanf("%c", &decision); 
} while (decision != 'E'); 
+4

Возможный дубликат некоторых других 'scanf' вопросов, где выяснилось, ОП не избавиться от символа новой строки? Используйте 'scanf ("% c ", & decision);' (обратите внимание на пробел), чтобы избавиться от новой строки. – Arc676

+0

Возможно, вам стоит проверить «r», «p» и «s» вместо столиц. – Fanax

+0

. Посмотрите на этот замечательный штрих кода, и он * все еще не компилируется ... – DevSolar

ответ

4

При чтении символов с использованием формата "%c", он будет читать следующий символ во входном буфере, он не будет пропускать какие-либо пробельных. И при использовании scanf, чтобы прочитать что-либо, новая строка, которую вы вводите для отправки ввода в программу, также будет отправлена ​​и добавлена ​​в качестве символа пробела после окончания ввода. Большинство форматов пропускают ведущее белое пространство (например, формат "%d"), но форматы "%c" и "%[" этого не делают.

При чтении персонажа почти всегда желательно пропускать ведущее белое пространство, которое делается путем добавления пробела перед форматом, например,

scanf(" %c", &decision); 
// ^
//  | 
// Note space here 

Также обратите внимание, что есть разница между прописными и строчными буквами. 'R' != 'r'. Либо проверьте как буквы верхнего и нижнего регистра, либо используйте toupper (или tolower) для преобразования.

1

вы лучше использовать getc()scanf() вместо внесения, так как вы ожидали один символ в любом случае

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