2017-04-30 3 views
6

정수를 구문 분석하려고하지만 다음 코드는 숫자로 시작되지만 문자가 추가 된 "3b"와 같은 문자열도 허용합니다. 그러한 문자열을 어떻게 거부합니까?C에 문자를 추가하지 않고 구문 분석

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) 
{ 
    int n; 
    if(argc==2 && sscanf(argv[1], "%d", &n)==1 && n>0){ 
     f(n); 
     return 0; 
    } 
    else{ 
     exit(EXIT_FAILURE); 
    } 
} 
+4

당신은'sscanf()'를 사용하지 않습니다; 당신은'strtol()'또는 유사한 것을 사용하고, 끝 포인터가 가리키는 곳을 체크한다. 아니면'sscanf()'를 사용해야한다면,'int pos; ... if (... && sscanf (argv [1], "% d % n", & n, & pos) == 1)''% n'은 변환으로 간주되지 않으므로 비교는 여전히' 1 '이 아니라'2 '입니다. 그런 다음'argv [1] [pos]'가 널 바이트인지 아닌지를 불평하면서 확인한다. –

+0

http://stackoverflow.com/questions/13199693/what-does-the-n-stand-for-in-sscanfs-d-n-i-n –

답변

4

문제의 경우 #include <stdlib.h> 라이브러리의 strtol() 기능을 사용할 수 있습니다.

방법은, str를 검색 포인터에있는 단어를 저장의 strtol 내부 strtol ( Sample code from tutorial points)

#include <stdio.h> 
#include <stdlib.h> 

int main(){ 
    char str[30] = "2030300 This is test"; 
    char *ptr; 
    long ret; 

    ret = strtol(str, &ptr, 10); 
    printf("The number(unsigned long integer) is %ld\n", ret); 
    printf("String part is |%s|", ptr); 

    return(0); 
} 

을 사용하려면 다음 수의 기본 변환된다. 기준이 2 ~ 36 사이이면 숫자의 기수로 사용됩니다. 하지만 10을 입력하면 자동으로 올바른 번호가 선택됩니다. 나머지는 ret에 저장됩니다.

+0

''3b ''와 같은 문자열을 거부하는 방법을 설명해야합니다. –

0

ctype.h 라이브러리는 당신에게 인수로 제공되는 문자가 숫자인지 여부를 반환 함수 isdigit에 (문자) 기능을 제공합니다.
당신은 argv [1]을 반복 할 수 있고 그것을 이렇게 검사 할 수 있습니다.

+0

'isdigit()'를 사용하는 것은 한자리 수만 허용되는 경우에 적합합니다. 여러 자리수의 정수가 허용되면,'isdigit()'는 그렇게 좋은 해결책이 아닙니다. 체크를 변환하는 문자열 - 정수 변환 함수를 사용하는 것이 좋습니다 ('atoi() '보다는 strtol()'et al). –

관련 문제