2017-03-04 30 views
1

분할 고장 나는 세 번째 명령 줄 내가했던, 그래서 숫자가 있는지 확인하기 위해 노력하고있어

int n; 
if (!isdigit(argv[3])) 
    { 
     fprintf(stderr, "n MUST be a number"); 
     return 4; 
    } else 
    { 
     n = atoi(argv[3]); 
     printf("%i\n",n); 
    } 

하지만 난 그냥

를 한 경우에 나는

Segmentation fault 

그러나 얻고있다

int n = atoi(argv[3]); 

가 잘 작동, 난 정말 이해하지 않는 이유

+2

'isdigit'는'int'를 기대합니다.'char *'를 먹이고 있습니다. 경고를 켭니다. – DeiDei

+1

'argc> = 4'를 어디에서 확인합니까? –

+2

'if (! isdigit (argv [3] [0]) || (argv [3] [0] == '-'&&! isdigit (argv [3] [1])))'또한 세 번째 명령 행은 다음과 같습니다. argv [2] (1 : argv [0], 2 : argv [1], 3 : argv [2]) – BLUEPIXY

답변

3

코멘트에 DeiDei가 맞습니다. 방식 ARGV 살펴 선언했다 :

int main (int argc, char *argv[]) 

그것은, 포인터의 배열의 경우 C 문자열에 대한 각 포인터 점, 문자 즉 배열. 따라서 argv[3]은 세 번째 인수의 첫 번째 문자에 대한 포인터입니다. (배열은 0부터 시작하지만 argv [0]은 프로그램의 이름입니다.)

isdigit에()는 다음과 같이 선언한다 :

int isdigit(int c); 

그래서 그것이 INT 아닌 포인터를 기대합니다. 당신은 포인터 역 참조는 다음과 같이 isdigit에에 보내는해야합니다 :

isdigit(*argv[3]) 

(C에서, 숯불은 INT의 특별한 경우이기 때문에 컴파일러는 이와 괜찮 것을 기억하십시오.)

+0

내 문제와 내 이해를 고쳐준 고마워요 하하 :) –

3

사람으로부터 : int isdigit(int c). 그러나 argv[3]char* (char to address)이므로 일치하지 않습니다. 추가

인수의 값은 부호없는 char 또는 EOF 값으로 나타낼 수 있어야합니다.

argv[3]은 uchar로 표현할 수 없으므로 동작이 정의되지 않으며 세그먼트 위반이 발생할 수 있습니다.