안녕하세요 저는 C를 처음 접했고 문자열 줄을 정수로 구문 분석하는 방법에 대해 혼란스러워하는 문제가 있습니다. 지금까지 내가 가진 방법은 첫 번째 문자열을 정수로 구문 분석하는 것입니다. 그래서 내 입력이 있다면 10 20 30
첫 번째 문자열 만 가져 와서 정수로 구문 분석합니다. 모든 줄을 읽고 .NET을 사용하여 정수 값으로 모두 구문 분석 할 수있는 솔루션을 찾는 방법에 대한 아이디어를 찾고 있습니다 getline()
.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char *line = NULL;
size_t len = 0;
int val =0;
int sum = 0;
while (getline(&line, &len, stdin) != EOF) {
printf("Line input : %s\n", line);
//printf("Test %d", val);
//parse char into integer
val = atoi(line);
printf("Parsed integer: %d\n", val);
}
free(line);
return 0;
}
주석에서 언급했듯이 문자열을 정수로 변환 하려면 strtol()
(또는 strtoX()
함수 계열의 다른 구성원 중 하나) 를 사용하는 것이 가장 좋습니다 . 다음은 올바른 사용법에strtol()
주의를 기울이는 코드 입니다 .
#include <errno.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char *line = NULL;
size_t len = 0;
while (getline(&line, &len, stdin) != -1)
{
printf("Line input : [%s]\n", line);
int val = atoi(line);
printf("Parsed integer: %d\n", val);
char *start = line;
char *eon;
long value;
errno = 0;
while ((value = strtol(start, &eon, 0)),
eon != start &&
!((errno == EINVAL && value == 0) ||
(errno == ERANGE && (value == LONG_MIN || value == LONG_MAX))))
{
printf("%ld\n", value);
start = eon;
errno = 0;
}
putchar('\n');
}
free(line);
return 0;
}
POSIX를 사용하여 줄을 읽는 질문의 코드 getline()
는 거의 정확합니다. 함수에 널 포인터에 대한 포인터를 전달하고, 그러나, 기술적으로 0에 대한 포인터를 전달하는 합법적 인 getline()
수익 -1
보다는 EOF
(있는 경우) 차이가 시스템을 거의 있기는하지만. 그럼에도 불구하고 표준 C는 EOF
음수 값을 허용 합니다. 반드시이어야하는 것은 아닙니다 -1
.
극한의 nitpickers를 들어,의 리눅스 및 맥 OS man 페이지 있지만 strtol()
"0을 반환하고 세트 상태 errno
로는 EINVAL
이 문자열을 변환하는 데 실패 할 경우"필요로하지 않는 C 표준 errno
이 설정됩니다. 그러나 변환이 실패 eon
하면로 설정됩니다 start
. 이는 표준에 의해 보장됩니다. 따라서 테스트의 일부 EINVAL
가 불필요 하다고 주장 할 여지가 있습니다 .
while
루프는 호출 콤마 연산자를 사용 strtol()
(할당으로 그 부작용에 대한 value
과 eon
), 그 결과를 무시 - 모든 가능한 반환 값이 유효하기 때문에 무시하는 것은 필수적이다. 조건의 다른 세 줄 (쉼표 연산자의 RHS)은 변환의 성공 여부를 평가합니다. 이렇게하면 호출을 strtol()
두 번 쓰는 것을 방지 할 수 있습니다. DRY (반복하지 마세요) 프로그래밍의 극단적 인 경우 일 수 있습니다.
코드 실행의 작은 샘플 (프로그램 이름 rn89
) :
$ rn89
1 2 4 5 5 6
Line input : [ 1 2 4 5 5 6
]
Parsed integer: 1
1
2
4
5
5
6
232443 432435423 12312 1232413r2
Line input : [232443 432435423 12312 1232413r2
]
Parsed integer: 232443
232443
432435423
12312
1232413
324d
Line input : [324d
]
Parsed integer: 324
324
$
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다