루프의 Printf가 초기 print 문없이 작동하지 않습니다.

mlz7

C에서 매우 기본적인 lexxer를 작성하려고 시도하고 있으며 다음과 같은 작업을 수행해야하는 다음 코드가 있습니다.

입력: "12 142 123"

산출:

NUMBER -- 12
NUMBER -- 14
NUMBER -- 123

그러나 printf("")입력을 반복하기 전에 초기 문을 포함하지 않으면 다음 과 같은 출력이 표시되는 문제가 있습니다. 출력 :

NUMBER --
NUMBER -- 14
NUMBER -- 123

첫 번째 숫자는 단순히 공백입니다. 나는 이것이 왜 일어나고 있는지에 대해 정말로 혼란스럽고 이것에 대한 도움을 정말로 고맙게 생각합니다!

다음 코드가 있습니다 (많은 관련없는 기능이 생략 됨).

#define MAX_LEN 400

char* input;
char* ptr;

char curr_type;
char curr;

enum token_type {
  END,
  NUMBER,
  UNEXPECTED
};

typedef struct {
  enum token_type type;
  char* str;
} Token;
  
void print_tok(Token t) {
  printf("%s -- %s\n", token_types[t.type], t.str);
}

char get(void) {
  return *ptr++;
}

char peek(void) {
  return *ptr;
}

Token number(void) {
  char arr[MAX_LEN];
  arr[0] = peek();
  get();
  int i = 1;
  while (is_digit(peek())) {
    arr[i] = get();
    ++i;
  }
  arr[++i] = '\0';
  Token ret = {NUMBER, (char*)arr};
  return ret;
}

Token unexpected(void) {
  // omitted
}

Token next(void) {
  while (is_space(peek())) get();

  char c = peek();
  switch (peek()) {
    case '0':
    // omitted
    case '9':
      return number();
    default: 
      return unexpected();
  }
}

int main(int argc, char **argv) {
  printf(""); // works fine with this line

  input = argv[1];
  ptr = input;

  Token tokens[MAX_LEN];
  Token t;
  int i = 0;
  do {
    t = next();
    print_tok(t);
    
    tokens[i++] = t;

  } while (t.type != END && t.type != UNEXPECTED);

  return 0;
}

user253751

이어 number, arr로컬 변수이다. 지역 변수는 함수가 종료되고 내용을 예측할 수 없을 때 소멸됩니다. 그럼에도 불구하고 프로그램은 Token구조체 의 포인터를 사용하여 값을 인쇄합니다 .

인쇄되는 값은 예측할 수 없습니다. 추가 printf("")문으로 인해 컴파일러가 변수를 덮어 쓰지 않도록 코드를 재 배열하거나 이와 비슷한 방식으로 코드를 재 배열 할 수 있습니다. 당신은 그것에 의지 할 수 없습니다.

토큰 당 메모리를 할당하는 몇 가지 다른 옵션이 있습니다.

  • 변경 strtoken대신 포인터의 문자의 배열 그래서. 그런 다음 각 토큰에는 문자열을 저장할 자체 공간이 있습니다.
  • 문자열을 malloc. 그런 다음 할당 된 상태로 유지 free됩니다.
  • main모두에 대해 유효하도록 에서 배열을 만듭니다 . 배열에 대한 포인터 를 제공 해야하므로 문자열을 저장할 위치를 알 수 있습니다. 이것은 한 번에 하나의 토큰 문자열 만 저장합니다.nextprint_toknext
  • 기본적으로 .NET 에서 지역 변수로 만드는 것 외에 배열을 만드는 다른 방법입니다 next.
  • 원래 문자열에서 토큰이있는 위치를 포인터로 지정하십시오. Token토큰의 길이를 저장하는 다른 변수를 추가하십시오 .

첫 번째 옵션이 가장 쉽고 마지막 옵션이 최소한의 메모리를 사용한다고 생각하지만 완성을 위해 다른 옵션을 포함했습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

두 개의 서로 다른 for 루프 사이의 printf가 작동하지 않습니다.

분류에서Dev

printf의 공백 채우기가 작동하지 않습니다.

분류에서Dev

println () 문이 없으면 Java 루프가 작동하지 않습니다.

분류에서Dev

내 playerCard의 초기화가 작동하지 않습니다

분류에서Dev

:: first-letter 가상 요소의 초기 문자 속성이 작동하지 않습니다.

분류에서Dev

역방향 기능없이 배열을 반전하지만 루프가 작동하지 않습니다.

분류에서Dev

범위 기반 for 루프의 const 참조가 작동하지 않습니다.

분류에서Dev

복사 할 수없는 유형의 중첩 된 목록 초기화가 작동하지 않습니다.

분류에서Dev

AngularJS : js 타이머의 초기화 데이터가 작동하지 않습니다.

분류에서Dev

bin 파일의 NASM 초기화 데이터가 작동하지 않는 것 같습니다.

분류에서Dev

기본 for 루프가 작동하지 않습니다.

분류에서Dev

문자에 대한 루프가 작동하지 않습니다.

분류에서Dev

문장 반전 루프가 작동하지 않습니다.

분류에서Dev

루프 자체 내에서 초기화를 생략 할 수있는 C for 루프가 의도 한대로 작동하지 않습니다.

분류에서Dev

chrooted jail의 ssh가 / dev / null 작업이 지원되지 않기 때문에 작동하지 않습니다.

분류에서Dev

for 루프의 break 문이 작동하지 않습니다.

분류에서Dev

루프 사이클을 반복하기 위해 카운트 값을 줄이는 것이 작동하지 않습니다. 파이썬의 for 루프에는 continue 문이있는 예외 처리기가 있습니다.

분류에서Dev

for 루프가 작동하지 않는 이유를 이해할 수 없습니다.

분류에서Dev

데이터로 cv :: Mat 초기화가 작동하지 않습니다.

분류에서Dev

프롤로그의 for 루프가 작동하지 않습니다.

분류에서Dev

내 루프가 작동하지 않는 이유를 찾을 수 없습니다.

분류에서Dev

AngularJS : 지시문의 '링크'대기가 작동하지 않습니다.

분류에서Dev

크롬의 window.print 강제 별도 페이지가 작동하지 않습니다.

분류에서Dev

다른 내부의 For 루프가 작동하지 않습니다.

분류에서Dev

스트라이프가 초기화되지 않았습니다.

분류에서Dev

for 루프 js 내부에서 변수 이름 만들기가 작동하지 않습니다.

분류에서Dev

for 루프가 작동하지 않음 : "문이 아닙니다"

분류에서Dev

lop이 루프 끝에서 작동하는 동안 Java 다시 그리기가 내부에서 작동하지 않습니다.

분류에서Dev

for 루프에 의해 설정된 모든 setTimeout 지우기가 예상대로 작동하지 않습니다.

Related 관련 기사

  1. 1

    두 개의 서로 다른 for 루프 사이의 printf가 작동하지 않습니다.

  2. 2

    printf의 공백 채우기가 작동하지 않습니다.

  3. 3

    println () 문이 없으면 Java 루프가 작동하지 않습니다.

  4. 4

    내 playerCard의 초기화가 작동하지 않습니다

  5. 5

    :: first-letter 가상 요소의 초기 문자 속성이 작동하지 않습니다.

  6. 6

    역방향 기능없이 배열을 반전하지만 루프가 작동하지 않습니다.

  7. 7

    범위 기반 for 루프의 const 참조가 작동하지 않습니다.

  8. 8

    복사 할 수없는 유형의 중첩 된 목록 초기화가 작동하지 않습니다.

  9. 9

    AngularJS : js 타이머의 초기화 데이터가 작동하지 않습니다.

  10. 10

    bin 파일의 NASM 초기화 데이터가 작동하지 않는 것 같습니다.

  11. 11

    기본 for 루프가 작동하지 않습니다.

  12. 12

    문자에 대한 루프가 작동하지 않습니다.

  13. 13

    문장 반전 루프가 작동하지 않습니다.

  14. 14

    루프 자체 내에서 초기화를 생략 할 수있는 C for 루프가 의도 한대로 작동하지 않습니다.

  15. 15

    chrooted jail의 ssh가 / dev / null 작업이 지원되지 않기 때문에 작동하지 않습니다.

  16. 16

    for 루프의 break 문이 작동하지 않습니다.

  17. 17

    루프 사이클을 반복하기 위해 카운트 값을 줄이는 것이 작동하지 않습니다. 파이썬의 for 루프에는 continue 문이있는 예외 처리기가 있습니다.

  18. 18

    for 루프가 작동하지 않는 이유를 이해할 수 없습니다.

  19. 19

    데이터로 cv :: Mat 초기화가 작동하지 않습니다.

  20. 20

    프롤로그의 for 루프가 작동하지 않습니다.

  21. 21

    내 루프가 작동하지 않는 이유를 찾을 수 없습니다.

  22. 22

    AngularJS : 지시문의 '링크'대기가 작동하지 않습니다.

  23. 23

    크롬의 window.print 강제 별도 페이지가 작동하지 않습니다.

  24. 24

    다른 내부의 For 루프가 작동하지 않습니다.

  25. 25

    스트라이프가 초기화되지 않았습니다.

  26. 26

    for 루프 js 내부에서 변수 이름 만들기가 작동하지 않습니다.

  27. 27

    for 루프가 작동하지 않음 : "문이 아닙니다"

  28. 28

    lop이 루프 끝에서 작동하는 동안 Java 다시 그리기가 내부에서 작동하지 않습니다.

  29. 29

    for 루프에 의해 설정된 모든 setTimeout 지우기가 예상대로 작동하지 않습니다.

뜨겁다태그

보관