2016-07-18 5 views
0

사용자가 하나의 char 만 입력하면 C 언어로 어떻게 처리 할 수 ​​있습니까? 이것에 나의 시도는 아래에있다 그러나 무섭게 실패했다. 내가 온라인으로 읽은 것에서는이 일을 성취하기 위해 함수를 사용하거나 fgets를 사용할 수 있다고 들었지만 그 방법을 알 수는 없었다.어떻게하면 사용자가 한 문자 만 입력 할 수 있습니까?

do 
{ 
    geussNumber += 1; 
    printf("Enter guess number %d\n", geussNumber); 
    scanf(" %c", &geussLetter); 
    scanf ("%c", &inputViolation); 
     if (isalpha(geussLetter) == 0) 
     { 
      printf("You did not enter a letter\n"); 
     } 
     else if (inputViolation == true) 
     { 
      printf("You eneterd more than one letter\n"); 
     } 
     else 
     { 
     inputLoopEnd = 1; 
     } 
} 
while(inputLoopEnd == false); 
+0

'inputViolation == true'는 끔찍한 것처럼 보입니다 ... 적어도 어떤 문자와 비교되어야한다고 생각합니다. – MikeCAT

+1

아니요, gets()는 버퍼 오버런의 가능성을 피할 수 없으므로 사용할 수 없습니다. C99에서는 더 이상 사용되지 않으며 C11에서는 삭제됩니다. – MikeCAT

+0

입력 문자열에 0 (true) 이외의 값을 읽으면 사용자가 하나 이상의 char을 입력했다고 생각했습니다. –

답변

-1

이는 fgets 같은 것들() 또는 fputs() 등 ... 그들은 사용으로 떨어지고있다을 사용하지 마십시오.

here에서 볼 수 있듯이이 함수는 str 유형의 객체를 처리하도록 설계되었으며 현재는 문자를 사용하는 데 주력하고 있으므로 문자를 처리하여 삶을 편하게 만듭니다.

이 당신이 당신이 할 수있는 생각하는 방식 ...

scanf(" %c", &geussLetter); 
scanf ("%c", &inputViolation); 

사용자가 하나의 그들이에 가정되는 방법 문자로 입력해도 때문에이 작동하지 않을 수 있습니다, 그것은 아직 할 수 없습니다 당신의 inputViolation scheme을 트리거 할 것입니다.

편집 : 2016년 7월 20일

정말 커뮤니티 위키 MOHAMAD's solution의 우아함과 같은 오후 12시 14분.

그래서 상황에 맞게 편집 했으므로 여기에서도 잘 작동합니다. 같은 생각 ...

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

int clean_stdin() 
{ 
    while (getchar() != '\n'); 
    return 1; 
} 

int main(void) 
{ 
    int first_time_around = 0; 
    char theguess = 0; 
    char c; 
    do 
    { 
     if (first_time_around == 0) 
      first_time_around++; 
     else 
      printf("Wrong input \n"); 

     printf("Enter guess number: \n"); 

    } while (((scanf("%c%c", &theguess, &c) != 2 || c != '\n') 
      && clean_stdin()) || !isalpha(theguess)); 

    return 0; 
} 
+0

누군가가 건설적인 비판없이 답을 득표 할 때 사랑해야합니다. 감사합니다 <.< ^.^ >.> –

+0

@ JeremyGarnet 위대한 답변 주셔서 감사하지만 나는 당신이 "substr() 메서드"를 사용하여 문자를 저장해야한다는 것을 이해하지 못합니다. –

+0

@JMaklen 커뮤니티 위키에서 훨씬 더 나은 해결책을 발견했으며 상황에 아주 잘 어울립니다. –

3

getc 제품군을 사용할 수 있습니다.

예를 들어 http://quiz.geeksforgeeks.org/difference-getchar-getch-getc-getche/을 살펴보십시오.

+1

C ** 표준에 속하지 않는 함수의 전체 패밀리 이름을 지정하는 것과 달리, 나는 "** getch' 계열의 함수라고 정확하게 부르지 않을 것입니다./O이지만 Microsoft 확장 프로그램의 일부인 ''은 잘못된 것입니다. "''getc' 계열의 기능"이 더 정확할 것입니다. – user3078414

+0

네가 맞아. 고마워. 나는 나의 대답을 업데이트했다. –

0

당신이 한 번에 입력 한 라인을 읽을 수 ( 사용자 유형 한 편지 추측하고 <이> 입력) 것, 그리고 당신은 추측이 실제로 단 하나의 문자가 포함되어 있는지 확인하고 싶습니다. 이러한 용어로 문제를 해결하면 fgets()을 어떻게 적용 할 수 있는지 명확하게 알 수 있습니다.이 기능의 목적은 한 번에 한 줄씩 읽는 것입니다. 전체 라인을 읽었거나 적어도 버퍼가 수용 할 수있는만큼의 것을 읽은 후에는 그 라인을 검증하고 추측을 추출 할 수 있습니다.

scanf()은 올바르게 사용하기가 어렵으므로 fgets() 접근 방식을 권장합니다. 당신이 scanf()를 사용하여 주장하는 경우, 그러나, 당신은 이런 식으로 할 수 있습니다

// consumes leading whitespace, inputs one character, then consumes any 
// immediately-following run of spaces and tabs: 
int result = scanf(" %c%*[ \t]", &guessLetter); 

if (result == EOF) { 
    // handle end-of-file ... 
} else { 
    assert(result == 1); // optional; requires assert.h 

    int nextChar = getchar(); 

    if ((nextChar == '\n') || (nextChar == EOF)) { 
     // handle multiple-character guess ... 
    } else if (!isalpha(guessLetter)) { 
     // handle non-alphabetic guess ... 
    } else { 
     // it's valid ... 
    } 
} 
+0

왜이 코드가 있습니까? (결과 == EOF) 사용자가 파일이 아닌 입력 스트림에서 입력을 받고 있습니까? –

+0

@JMaklen, end-of-file은 표준 입력에서도 여러 가지 방법으로 발생할 수 있습니다. 그 결과가 프로그램의 일반적인 사용을 기대하지 않는다고해도 결코 발생하지 않을 것이라고 가정하는 것은 바람직하지 않습니다. –

+0

scanf를 사용하는 경우 어떻게하면 EOF를 얻을 수 있습니까? 사용자는 값을 입력 할 수 있지만 파일을 입력하는 방법은 무엇입니까? –