programing

scanf()는 버퍼에 줄바꿈 문자를 남깁니다.

shortcode 2022. 12. 24. 21:16
반응형

scanf()는 버퍼에 줄바꿈 문자를 남깁니다.

다음과 같은 프로그램이 있습니다.

int main(int argc, char *argv[])
{
  int a, b;
  char c1, c2;
  printf("Enter something: ");
  scanf("%d",&a); // line 1
  printf("Enter other something: ");
  scanf("%d", &b); // line 2

  printf("Enter a char: ");
  scanf("%c",&c1); // line 3
  printf("Enter another char: ");
  scanf("%c", &c2); // line 4

  printf("Done"); // line 5

  system("PAUSE");

  return 0;
}

, 는 C라고 합니다.scanf()버퍼에 줄바꿈 문자를 남깁니다.따라서 프로그램은 사용자가 데이터를 입력할 수 있도록 줄바꿈4에서 정지하지 않고 새 줄바꿈 문자를 c2에 저장하고 줄5로 이동합니다.

그래요?

요?char 데이터형? 데이터형? 저는 이 를 본 입니다.int1,, 3. 2, 입니다.맞??

이 함수는 문자 이외의 변환을 구문 분석하기 전에 선행 공백을 자동으로 건너뜁니다.문자 형식(주로)%c 또한 ; " 세트"%[…]및 - " "%n생략하지 는 예외입니다.공백은 생략하지 않습니다.

" %c"생략 가능한 공백은 생략할 수 있습니다..scanf()포맷 문자열

이 경우 입력 스트림에 남아 있는 후행 공백은 사용되지 않으며, 행의 끝부분도 사용되지 않으므로, 같은 입력 스트림을 사용하거나 같은 입력 스트림에 있는 경우에도 주의해야 합니다.변환하기 전에 스캔프(scanf)가 공백 공간을 건너뛸 수 있도록 하는 중입니다.%d기타 문자 이외의 변환도 가능합니다.


의 리터럴 텍스트와 같이 변환 이외의 공백 이외의 「지시」(POSIX 스캔프 용어 사용)에 주의해 주세요.scanf("order = %d", &order);공백도 생략하지 않습니다. 그대로의 「」order을음

아마 은 ★★★★★★★★★★★★★★★★★★★★★★★★★★★." order = %d"앞의 행에서 새로운 행을 건너뛰는 경우에도 이 질문처럼 고정 문자열에 리터럴 일치가 필요한 경우.

scanf(" %c", &c2);이치노

getchar() 번째를 scanf()

scanf("%c", &c1);
getchar();  // <== remove newline
scanf("%c", &c2);

C++대한 다른 답변에 올린 내용을 반영하려면: 토스를 권장합니다.scanf(), "사용하지 않음"을 합니다.fgets() ★★★★★★★★★★★★★★★★★」sscanf().

그 이유는 적어도 Unix와 같은 시스템에서는 기본적으로 CLI 프로그램이 실행되는 단말기가 프로그램이 사용자 입력을 인식하기 전에 사용자 입력을 처리하기 때문입니다.새로운 행이 입력될 때까지 입력을 버퍼링하여 백스페이스의 조작 등 기본적인 행 편집이 가능합니다.

따라서 한 번에 한 글자씩 또는 몇 글자씩 전체 행으로 표시할 수 없습니다.하지만 그건 그렇지 않아요. scanf("%d")대신 디짓만 처리하고 거기서 정지하며 나머지는 C 라이브러리에 버퍼링되어 있습니다.stdio이치노

printf("Enter a number: ");
scanf("%d", &a);

printf("Enter a word: ");
scanf("%s", word);

이 줄을 합니다.123 abcd, 양쪽이 모두 완료됩니다. scanf()한 번에 새로운 행이 지정된 후에만. 번째 ★★★★★★★★★★★★★★.scanf()그 번호가서 끝난 의 회선 있기 에), 및 두 회선 버퍼에서는 회선이 .scanf()을 기다리지 에, 이미 버퍼가 에).%s★★★★★★★★★★★★★★★★★★」

이것은 유저가 통상 기대하는 것이 아닙니다.

대신 Enter 키를 누르면 입력이 완료되고 Enter 키를 누르면 기본값 또는 오류가 발생하며, 이에 대한 답변만 제시합니다.

건 안 돼요.scanf("%d")사용자가 Enter 키를 누르기만 하면 아무 일도 일어나지 않습니다. ★★★★★★★★★★★★★★★★★★scanf()아직 번호를 기다리고 있습니다.하지만, 회선을 할 수 .는 회선을 전송하지 않기 입니다.scanf()사용자의 실수에 대응할 기회가 없습니다.

그것도 별로 쓸모가 없어요.

저는, 음, 음, 음, 음, 음, 음, 음, 음, 음, hence, hence, hence, hence을 사용하는 것이 좋습니다.fgets() ★★★★★★★★★★★★★★★★★」getline()한 번에 모든 입력 내용을 읽을 수 있습니다.이것은 단말기가 제공하는 것과 정확히 일치하며, 사용자가 회선을 입력한 후에 항상 프로그램 제어 권한을 부여합니다. 때문에 경우, 라인에 대해서 어떻게 할지는 에게 달려있습니다.번호가 필요한 경우atoi(),strtol() 「」의 경우도 있습니다.sscanf(buf, "%d", &a)를 참조해 주세요. sscanf() doesn doesn doesn as as as as as as as as as as as 와 같은 없다scanf()읽기 버퍼의 크기는 한정되어 있고, 버퍼가 종료되면 종료되기 때문에 함수는 더 이상 기다릴 수 없습니다.

)fscanf()파일 형식이 공백처럼 줄바꿈을 건너뛰는 방법을 지원하는 파일 형식인 경우에도 일반 파일의 경우 문제가 없습니다.데이터라면, 선선향, 는는, 를 사용합니다.fgets() ★★★★★★★★★★★★★★★★★」sscanf()


위의 내용 대신 다음과 같은 내용을 사용합니다.

printf("Enter a number: ");

fgets(buf, bufsize, stdin);
sscanf(buf, "%d", &a);

'돌아가다'의 해 보세요.sscanf()도 있습니다.

#include <stdio.h>

int main(void)
{
    const int bufsize = 100;
    char buf[bufsize];
    int a;
    int ret;
    char word[bufsize];

    printf("Enter a number: ");
    fgets(buf, bufsize, stdin);

    ret = sscanf(buf, "%d", &a);

    if (ret != 1) {
        fprintf(stderr, "Ok, you don't have to.\n");
        return 1;
    }

    printf("Enter a word: ");
    fgets(buf, bufsize, stdin);

    ret = sscanf(buf, "%s", word);
    if (ret != 1) {
        fprintf(stderr, "You make me sad.\n");
        return 1;
    }

    printf("You entered %d and %s\n", a, word);
}

이 계속 ,, 만, 면, the, the, the, the, the, the, the, the, 신, 당, 당, 당, 당, the, the, the, the, the, the, the, the, the, the, the, the, the, the, the, the, the, the, the, the, the, the, the, the, the,를 루프fgets() ★★★★★★★★★★★★★★★★★」sscanf()사용자가 지시받은 대로 실행하거나 오류와 함께 즉시 종료할 때까지 계속합니다.사용자가 공놀이를 원하지 않을 경우 프로그램이 무엇을 해야 하는지에 따라 달라집니다.


같은 해서 할 수 .getchar()를 읽다scanf("%d")반환되어 버퍼에 남아 있는 가비지가 모두 클리어 됩니다만, 유저가 빈 행에 Enter 키를 눌렀을 경우는, 아무것도 행해지지 않습니다.어,는fgets()새 행까지 읽을 수 있기 때문에 직접 읽을 필요는 없습니다.

(여기서 얻은) 다른 옵션은 assignment-suppression 옵션을 사용하여 새 행을 읽고 폐기하는 것입니다.그렇게 하기 위해서, 우리는 단지 아스타리스크와 함께 문자를 읽는 형식을 넣었을 뿐이다.% ★★★★★★★★★★★★★★★★★」c:

scanf("%d%*c",&a); // line 1
scanf("%c%*c",&c1); // line 3

scanf그러면 다음 문자(즉, 새 행)가 읽히지만 포인터에는 할당되지 않습니다.

단, 최종적으로 FAQ의 마지막 옵션에 찬성합니다.

또는 요건에 따라 scanf()/getchar()를 잊어버리고 fgets()를 사용하여 사용자로부터 텍스트 행을 가져와 직접 해석할 수도 있습니다.

/*Take char input using scanf after int input using scanf just use fflush(stdin) function  after int input */
#include<stdio.h>
#include<conio.h>
void main()
{
  int x;
  char y;
  clrscr();
  printf(" enter an int ");
  scanf("%d",&x);
  fflush(stdin);
  printf("\n Now enter a char");
  scanf("%c",&y);
  printf("\n X=%d and Y=%c",x,y);
  getch();
}

언급URL : https://stackoverflow.com/questions/5240789/scanf-leaves-the-newline-character-in-the-buffer

반응형