문제

나는 몇 가지 코드를 시작했고 원래 개발자가 무엇을하고 있는지 궁금했습니다. 아래는이 패턴을 사용하는 단순화 된 프로그램입니다.

      #include <stdio.h>

      int main()  {     

      char title[80] = "mytitle";      
      char title2[80] = "mayataiatale";      
      char mystring[80]; 

      /* hugh ? */
      sscanf(title,"%[^a]",mystring);
      printf("%s\n",mystring); /* Output is "mytitle" */


      /* hugh ? */
      sscanf(title2,"%[^a]",mystring); /* Output is "m" */
      printf("%s\n",mystring);


      return 0;  
  }

그만큼 Scanf의 남자 페이지 관련 정보가 있지만 읽는 데 어려움이 있습니다. 이런 종류의 표기법을 사용하는 목적은 무엇입니까? 성취하려는 것은 무엇입니까?

도움이 되었습니까?

해결책

캐릭터 클래스의 주된 이유는 필드 길이를 지정하더라도 %S 표기법이 첫 번째 공백 문자에서 멈추고 종종 원하지 않기 때문입니다. 이 경우 문자 클래스 표기법이 매우 도움이 될 수 있습니다.

이 코드를 고려하여 최대 10 자 줄을 읽고 과잉을 버리고 공간을 유지하십시오.

#include <ctype.h>
#include <stdio.h>

int main(void)
{
    char buffer[10+1] = "";
    int rc;
    while ((rc = scanf("%10[^\n]%*[^\n]", buffer)) >= 0)
    {
            int c = getchar();
            printf("rc = %d\n", rc);
            if (rc >= 0)
                    printf("buffer = <<%s>>\n", buffer);
            buffer[0] = '\0';
    }
    printf("rc = %d\n", rc);
    return(0);
}

이것은 실제로 다음과 관련된 comp.lang.c. 모더 레이트 (2004 년 6 월경)에 대한 토론의 예제 코드였습니다. getline() 변형.


적어도 일부 혼란은 지배합니다. 첫 번째 형식 지정자, %10[^\n], 최대 10 개의 비 뉴 라인 문자를 읽고 후행 널과 함께 버퍼에 할당됩니다. 두 번째 형식 지정자, %*[^\n] 과제 억제 문자를 포함합니다 (*) 및 입력에서 나머지 비 뉴 라인 문자를 0 이상 읽습니다. 때 scanf() 함수가 완료되고 입력이 다음 Newline 문자를 가리키고 있습니다. 루프의 본문은 해당 캐릭터를 읽고 인쇄하여 루프가 다시 시작될 때 입력이 다음 줄의 시작을보고 있습니다. 그런 다음 과정이 반복됩니다. 라인이 10 자 미만인 경우 해당 문자는 버퍼로 복사되고 '0 개 이상의 비 뉴 라인'형식은 비 뉴 라인이 0이됩니다.

다른 팁

구조는 같은 것입니다 %[a] 그리고 %[^a] 존재합니다 scanf() 일종의 어휘 분석기로 사용할 수 있습니다. 이것들은 일종의 것입니다 %s, 그러나 가능한 많은 "stringy"문자의 범위를 수집하는 대신 캐릭터 클래스에서 설명한대로 문자 범위 만 수집합니다. 글쓰기가있을 수 있습니다 %[a-zA-Z0-9] 이해가 될 수도 있지만 보완 클래스를위한 설득력있는 사용 사례를 볼 수는 없습니다. scanf().

IMHO, scanf() 이 작업에 적합한 도구는 아닙니다. 더 강력한 기능 중 하나를 사용할 때마다 결국 그것을 찢어 내고 다른 방식으로 기능을 구현했습니다. 어떤 경우에는 LEX를 사용하여 실제 어휘 분석기를 작성하지만 일반적으로 한 번에 I/O에 라인을 수행하고 토큰으로 거친 작업을 수행했습니다. strtok() 가치 변환이 충분했습니다.

편집하다: 나는 찢어졌다 scanf() 일반적으로 사용자가 잘못된 입력을 제공한다고 주장하는 사용자와 직면했을 때 프로그램이 문제에 대한 좋은 피드백을 제공하고 어셈블러 인쇄 "오류가 종료"를 제공하는 데 도움이되지 않기 때문입니다. 유일한 유용한 오류 메시지가 내 사용자와 잘 어울리지 않았습니다. (나, 그 경우).)

그것은 정규 표현의 캐릭터 세트와 같습니다. [0-9] 일련의 숫자와 일치하고 [^aeiou] 소문자 모음이 아닌 것과 일치합니다.

숫자, 식별자, 공백 덩어리 등과 같은 모든 종류의 용도가 있습니다.

당신은 그것에 대해 읽을 수 있습니다 ISO/IEC9899 표준 사용 가능한 온라인.

다음은 문서에서 인용 한 단락입니다. [ (286 페이지) :

예상 문자 세트에서 비어 있지 않은 문자 순서와 일치합니다.

변환 지정자는 형식 문자열의 모든 후속 문자, 일치하는 오른쪽 브래킷 (])을 포함합니다. 왼쪽 브래킷의 문자가 Circumflex (^)가 아닌 한 브래킷 (스캔리스트) 사이의 문자는 스캔을 구성합니다. 변환 지정자가 [] 또는 [^]로 시작하면 오른쪽 브래킷 문자는 스캔리스트에 있고 다음 오른쪽 브래킷 문자는 사양을 끝내는 오른쪽 브래킷입니다. 그렇지 않으면 첫 번째 오른쪽 브래킷 문자는 사양을 종료하는 것입니다. A- 캐릭터가 스캔리스트에 있고 첫 번째 캐릭터가 아닌 첫 번째 문자가 A ^, 마지막 문자 인 경우, 동작은 구현 정의됩니다.

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