2017-09-14 51 views
2

optarg (Getop 라이브러리의 -s 플래그 다음에 나오는 인수)가 숫자가 아닌 경우 오류 메시지를 인쇄하고 프로그램을 종료하고 원하는 경우 숫자 인 경우 크기를 optarg로 설정해야합니다. 내가 가진 문제는 -s r과 같은 명령이 오류 메시지에 부딪히는 반면 -s 2는 문자열을 2로 해석한다는 의미입니다. I 라인 # 1, 위한 int 값 2 선 # 2 0 int 값을 얻는 2 -sC isdigit을 사용하여 optarg가 숫자인지 확인

#1 printf("%d",atoi(optarg)); 
#2 printf("%d",isdigit(atoi(optarg))); 

위해 함께

디버깅.

내가 왜 atdi (optarg)가 int를 줄 때, isdigit (atoi (optarg)))가 0인지 궁금합니다. optarg가 int인지 확인하는 더 좋은 방법이 있습니까?

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


int size; 
char option; 
size = 0; 
const char *optstring; 
optstring = "rs:pih"; 

while ((option = getopt(argc, argv, optstring)) != EOF) { 
    switch (option) { 
     case 'r': 
      type_set = 1; 
      break; 
     **case 's': 
      capacity_set = 1; 
      if(isdigit(atoi(optarg))==0){ 
       fprintf(stderr,"Argument after -s needs to be an int\n"); 
       return 0; 
      }** 
      else{ 
       size = atoi(optarg); 
      } 
      break; 

     default{ 
     return 0; 
     } 

답변

3

isdigit은 문자인지 여부를 알려줍니다. atoi은 문자열 (char *)을 취해 문자열이 나타내는 숫자를 반환합니다. 그래서 전화 할 때 isdigit(atoi( ... 당신은 숫자를 가져 와서 그것을 캐릭터로 다루고 있습니다. 숫자에 대한 charater 코드는 48..57이므로 이들 중 하나 이외의 숫자는 false를 반환합니다.

아마 isdigit(*optarg)이 필요합니다. 이것은 인수 (문자열)의 첫 번째 문자가 숫자 문자인지 알려줍니다. 물론 이것은 첫 번째 문자 만 살펴므로 대신 isdigit(optarg[0]) && optarg[1] == 0을 원할 수 있습니다. 당신이 보다는 자리 (만 숫자를) 수락 할 경우

strtol 당신이 실패를 확인 할 수 있습니다로 atoi보다 훨씬 더 작동합니다. 다음과 같음 :

char *end; 
errno = 0; 
size = strtol(optarg, &end, 10); 
while (isspace(*end)) ++end; 
if (errno || *end) { 
    // an error occurred on conversion, or there is extra cruft 
    // after a number in the argument. 
    fprintf(stderr,"Argument after -s needs to be an int\n"); 
    return 0; } 
+0

그러나 주 (내가 아는 크리스 알이), 그 atoi 함수가 제공하는 당신은 그냥 OPTARG가 한 자리 인 경우 알고 싶은 가정 (다음과 같이 또 다른, 어쩌면 더 간단한 방법은 * 0 * 변환에 오류가 있으면 캐치 할 수 있습니다. 단순히 첫 번째 문자를 전달하면 단순히 '+/-'가 숫자를 처리 할 수 ​​없기 때문에 좋습니다. –

+0

왜 atoi를 사용하지 않는 것이 좋을까요? 한자리 수 (OP가 말한대로). * 숫자 *가 아닌 * 숫자 *를 받아들이려는 경우 다른 것을 필요로합니다. –

+0

그걸 두들겨 마시지 않겠습니다. OP를 이해하고 싶었다. 'atoi'에는 한계가있다. 나는 특히 첫 번째 문자를 사용하는 것을 좋아하지만, 사용자가'+/-'를 지정하려고하면'isdigit' 제한이있다. (실제로는 대소 문자가 있지만 실제로는). –

2

Chris Dodd는 훌륭한 답변을 제공합니다.

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

// Assuming ASCII. "string" must be one character long and it 
// must be a digit 
int isSingleDigit(char *str) 
{ 
    return((strlen(str) == 1) && (*str >= '0' && *str <= '9')); 
} 

int main (void) 
{ 

    char *str = "a"; 
    char *str1 = "9"; 
    char *str2 = "10"; 
    char *str3 = "1a"; 


    printf("%s %d\n", str, isSingleDigit(str)); 
    printf("%s %d\n", str1, isSingleDigit(str1)); 
    printf("%s %d\n", str2, isSingleDigit(str2)); 
    printf("%s %d\n", str3, isSingleDigit(str3)); 


    return 0; 
} 

출력 :

a 0 
9 1 
10 0 
1a 0 
+1

분명히'* str> = '0'... '은'* str> 0x2F ...'보다 이해하기 쉽고 이식성이 좋다. – chux