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;
}
이어 number
, arr
로컬 변수이다. 지역 변수는 함수가 종료되고 내용을 예측할 수 없을 때 소멸됩니다. 그럼에도 불구하고 프로그램은 Token
구조체 의 포인터를 사용하여 값을 인쇄합니다 .
인쇄되는 값은 예측할 수 없습니다. 추가 printf("")
문으로 인해 컴파일러가 변수를 덮어 쓰지 않도록 코드를 재 배열하거나 이와 비슷한 방식으로 코드를 재 배열 할 수 있습니다. 당신은 그것에 의지 할 수 없습니다.
토큰 당 메모리를 할당하는 몇 가지 다른 옵션이 있습니다.
str
에 token
대신 포인터의 문자의 배열 그래서. 그런 다음 각 토큰에는 문자열을 저장할 자체 공간이 있습니다.malloc
. 그런 다음 할당 된 상태로 유지 free
됩니다.main
모두에 대해 유효하도록 에서 배열을 만듭니다 . 배열에 대한 포인터 를 제공 해야하므로 문자열을 저장할 위치를 알 수 있습니다. 이것은 한 번에 하나의 토큰 문자열 만 저장합니다.next
print_tok
next
next
.Token
토큰의 길이를 저장하는 다른 변수를 추가하십시오 .첫 번째 옵션이 가장 쉽고 마지막 옵션이 최소한의 메모리를 사용한다고 생각하지만 완성을 위해 다른 옵션을 포함했습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다