문제

대학에서 나는 우리의 프로그램이 명령 줄 인수에서 문자열이 들어가는 지 여부를 감지하는지 물었다../Program 3.7). 이제 나는 이것을 어떻게 감지 할 수 있는지 궁금합니다. 예를 들어 입력 a Atoi가 검출하는 유효하지 않지만 예를 들어 입력합니다. 3.6 유효하지 않아야하지만 ATOI는 이것을 정수로 변환합니다.

#include <stdio.h>

int main(int argc, char *argv[]) {
    if (argc > 1) {
        int number = atoi(argv[1]);
        printf("okay\n");
    }
}

그러나 Argv [1]이 실제로 정수 인 경우에만 인쇄되어야합니다. 내 질문이 분명하기를 바랍니다. 많은 감사합니다.

도움이 되었습니까?

해결책

살펴보십시오 strtol.

endptr이 null이 아닌 경우 strtol ()는 *endptr에 첫 번째 유효하지 않은 문자의 주소를 저장합니다. 그러나 숫자가 전혀 없다면 strtol ()은 *endptr에 str의 원래 값을 저장합니다. (따라서 *str이 아닌 경우 \0' but **endptr is0 '반환시 전체 문자열이 유효했습니다.)

#include <stdio.h>

int main(int argc, char *argv[]) {
  if (argc > 1) {
    char* end;
    long number = strtol(argv[1], &end, 0);
    if (*end == '\0')
      printf("okay\n");
  }
}

다른 팁

코드에서 어떻게 수행 할 수 있는지 알고 싶다고 가정하면 (실제로 숙제 일 경우 가능) 한 가지 방법은 문자열 측면에서 정수를 구성하는 요소에 대해 생각하는 것입니다. 아마도 아마도 다음과 같습니다.

  • 선택 사인, +/-.
  • 필요한 숫자.
  • 옵션 숫자가 다수 (그러나 오버플로를 조심하십시오).
  • 문자열의 끝.

이 사양에서, 당신은 당신을 위해 작업을 수행 할 함수를 작성할 수 있습니다.

이 의사 코드와 같은 것이 좋은 출발입니다.

set sign to +1.
set gotdigit to false.
set accumulator to 0.
set index to 0.
if char[index] is '+':
    set index to index + 1.
else:
    if char[index] is '-':
        set sign to -1.
        set index to index + 1.
while char[index] not end-of-string:
    if char[index] not numeric:
        return error.
    set accumulator to accumulator * 10 + numeric value of char[index].
    catch overflow here and return error.
    set index to index + 1.
    set gotdigit to true.
if not gotdigit:
    return error.
return sign * accumulator.
int okay = argc>1 && *argv[1];
char* p = argv[1];
int sign = 1;
int value = 0;
if( *p=='-' ) p++, sign=-1;
else if( *p=='+' ) p++;
for( ; *p; p++ ) {
    if( *p>='0' && *p<='9' ) {
        value = 10*value + *p-'0';
    } else {
        okay = 0;
        break;
    }
}
if( okay ) {
    value *= sign;
    printf( "okay, value=%d\n", value );
}

편집 : 허용 - 및 + 문자

이것을 조밀 한 1 또는 2 라이너로 압축 할 수도 있습니다. 또는 동일한 기능을 가진 라이브러리 기능을 찾을 수 있습니다.)

edit2 : 그냥 재미를 위해 - 이제 숫자를 구문 분석해야합니다.

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