2016-11-10 18 views
1

일부 명령 줄 인수로 프로그램을 실행하고 있습니다. 내가 10, 10, 10를 입력하고 그들을 밖으로 인쇄 할 때, 그것은 밖으로 인쇄 49, 49, 49 여기 내 코드입니다 :C에서 명령 줄 인수의 정수 인쇄

int main(int argc, char *argv[]) { 
    int seed = *argv[0]; 
    int arraySize = *argv[1]; 
    int maxSize = *argv[2]; 

왜 이런 일이?

답변

1

음, argv은 문자열에 대한 포인터의 배열입니다. 모든 명령 행 인수는 문자열으로 전달되고 각각에 대한 포인터는 argv[n]에 의해 유지되며 인수의시 v 스는 n+1입니다. C11을 인용 호스팅 환경의

, 장 argc의 값이 0보다 큰 경우, 문자열이 argv[0] 가 가리키는

§5.1.2.2.1는 프로그램 이름을 나타냅니다; 호스트 환경에서 프로그램 이름을 사용할 수없는 경우 argv[0][0]은 널 문자입니다. argc의 값이 보다 큰 경우 argv[1]에서 argv[argc-1] 까지의 문자열은 프로그램 매개 변수를 나타냅니다.

그래서, 명확하게,

./123 10 10 10 // 123와 같은 실행 바이너리 명

  • argv[0]은 최초의 "명령 줄 인수되지이다 프로그램에 전달 "했다. 그것은 argv[1]입니다.
  • *argv[1]은 명령 줄 인수로 전달한 int 값을 반환하지 않습니다.

    기본적으로 *argv[1]는 (즉, '1'char 값), 가장 가능성이 ASCII 코드 값 (당신이 플랫폼을 사용하는)에, ANSD ascii table'1'에 따라 당신에게 그 문자열의 첫 번째 요소의 값을 제공합니다 당신이 보는 49의 십진수가 있습니다.

솔루션 : 당신은

  • 루프
  • 입력 문자열의 각 변환 argv[1] ~ argv[n-1]argc == n 동안 각 인수 문자열을 통해 인수의 수 (argc)에 대한

    • 확인해야 int (이 경우에는 strtol()을 사용할 수 있습니다.)
  • 1

    문자열 (*argv[x])를 역 참조하는 당신에게 char (문자열의 첫 번째 문자의 값)을 제공,이 경우 값은 ASCII '1'입니다 : 당신은 (역 참조하지 않고) 그 문자열을 변환 할 수 있습니다

    49 진수 프로그램의 이름이 어쨌든 argv[0]

    int arraySize = (int)strtol(argv[1], NULL, 10); 
    

    strtol입니다 사용하여, 당신은 프로그램 이름이 1로 시작해야입니까?