문제

C에서 한 문자 입력을 받으려면 추가 문자가 전송되었는지 어떻게 확인하고, 그렇다면 어떻게 지울 수 있습니까?

getc(stdin)처럼 작동하지만 사용자에게 문자를 입력하라는 메시지를 표시하지 않으므로 그냥 넣을 수 있는 함수가 있습니까? while(getc(stdin)!=EOF);?또는 버퍼의 다음 문자를 엿보는 함수이며, NULL(또는 거기에 있는 모든 항목)을 반환하지 않으면 stdin을 플러시하는(nother) 함수를 호출할 수 있습니까?

편집하다

그래서 지금 당장은 scanf가 트릭을 수행하고 있는 것 같지만, 이를 읽을 수 있는 방법이 있습니까? 전체 문자열, 개행 문자까지?가장 가까운 공백이 아닌?"%s %s %s" 또는 무엇이든 형식 문자열에 넣을 수 있다는 것을 알고 있지만 임의의 수의 공백을 처리할 수 있습니까?

도움이 되었습니까?

해결책

입력 스트림을 플러시할 수 없습니다.그렇게 하면 정의되지 않은 동작이 호출됩니다.가장 좋은 방법은 다음을 수행하는 것입니다.

int main() {
  int c = getchar();
  while (getchar() != EOF);
  return 0;
}

사용 scanf 마법:

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

#define str(s) #s
#define xstr(s) str(s)
#define BUFSZ 256

int main() {
  char buf[ BUFSZ + 1 ];
  int rc = scanf("%" xstr(BUFSZ) "[^\n]%*[^\n]", buf);
  if (!feof(stdin)) {
    getchar();
  }
  while (rc == 1) {
    printf("Your string is: %s\n", array);
    fflush(stdout);
    rc = scanf("%" xstr(LENGTH) "[^\n]%*[^\n]", array);
    if (!feof(stdin)) {
        getchar();
    }
   }
   return 0;
}

다른 팁

당신이 사용할 수있는 getline 전체 입력 줄을 읽으려면.

또는 (원래 질문에 대한 응답으로) 전화할 수 있습니다. select 또는 poll stdin에서 읽어야 할 추가 문자가 있는지 확인하세요.

오늘도 비슷한 문제가 있었고 작동하는 것 같은 방법을 찾았습니다.나는 당신의 상황을 자세히 모르기 때문에 그것이 당신에게 효과가 있을지 없을지 모르겠습니다.

저는 키보드에서 단일 문자를 가져와야 하는 루틴을 작성하고 있으며 이는 세 가지 특정 키 입력('1', '2' 또는 '3') 중 하나여야 합니다.그 중 하나가 아닌 경우 프로그램은 오류 메시지를 보내고 다시 시도해야 합니다.

문제는 내가 입력한 문자가 getchar()에 의해 반환되는 것 외에도 'Enter' 키 입력(키 입력을 프로그램에 보내는 것)이 입력 버퍼에 저장된다는 것입니다.인쇄되지 않는 개행 문자는 오류 수정 루프의 getchar() 기능에 의해 반환되어 두 번째 오류 메시지가 추가로 발생합니다(개행 문자가 '1' 또는 '2'가 아니기 때문에). , '3'도 마찬가지입니다.)

때로는 한 글자도 입력하지 않고 이러한 옵션 중 하나가 요청하는 파일 이름을 입력하기 때문에 문제는 더욱 복잡해집니다.그런 다음 버퍼에 원하지 않는 문자의 전체 문자열이 있어 화면 아래로 스크롤되는 긴 오류 메시지 목록이 표시됩니다.

쿨하지 않아.

그러나 이를 해결한 것으로 보이는 것은 다음과 같습니다.

c = getchar();  // get first char in line
while(getchar() != '\n') ; // discard rest of buffer

첫 번째 줄은 내가 입력한 문자를 실제로 사용하는 줄입니다.두 번째 줄은 입력 버퍼에 남아 있는 잔여물을 처리합니다.단순히 입력 버퍼에서 한 번에 문자를 가져오는 루프를 생성합니다.문이 반복되는 동안 수행되도록 지정된 작업이 없습니다.단순히 문자를 읽고 개행 문자가 아닌 경우 다음 문자로 돌아갑니다.줄바꿈을 찾으면 루프가 종료되고 프로그램의 다음 비즈니스 순서로 진행됩니다.

다음과 같이 키보드 버퍼를 지우는 함수를 만들 수 있습니다.

#include <stdio.h>

void clear_buffer(){
   char b;
   //this loop take character by character in the keyboard buffer using 
   //getchar() function, it stop when the variable "b" was
   //enter key or EOF.
   while (((b = getchar()) != '\n') && (b != EOF));
}

int main()
{
    char input;
    //get the input. supposed to be one char!
    scanf("%c", &input); 
    //call the clearing function that clear the buffer of the keyboard 
    clear_buffer(); 
    printf("%c\n",input); //print out the first character input
    // to make sure that our function work fine, we have to get the
    // input into the "input" char variable one more time
    scanf("%c", &input); 
    clear_buffer();  
    printf("%c\n",input);
    return 0;
}

많은 문자(1개 이상, 256개 이상)를 사용하는 읽기를 사용하고 실제로 얼마나 많은 문자가 반환되는지 확인하세요.둘 이상을 얻으면 알 수 있습니다.하나만 얻으면 그게 전부입니다.

플랫폼에 대해 언급하지 않으셨는데 이는 매우 빠르게 까다로워집니다.예를 들어 Unix(Linux)에서 일반 메커니즘은 데이터 줄(아마도 뒤에 오는 문자 하나와 개행 문자)을 반환합니다.또는 사용자에게 ^D(기본값)를 입력하여 앞의 문자를 보내도록 설득할 수도 있습니다.아니면 제어 기능을 사용하여 터미널을 원시 모드(예: 다음과 같은 프로그램)로 전환할 수도 있습니다. vi 그리고 emacs 하다).

Windows에서는 잘 모르겠습니다. getch() 필요한 작업을 수행하는 기능입니다.

getc 대신 scanf를 사용하면 어떨까요? scanf를 사용하면 전체 문자열을 얻을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top