2016-07-04 2 views
-2

문자열을 가져 와서 십진수/부동/8 진수/16 진수로 변환 할 수 있는지 확인하려고합니다.일부 경우 문자열을 10 진수로 변환합니까?

이 문자열을 배열에 저장하고이를 반복하여 어떤 요소인지 확인했습니다.

for(int k=0;k<i;k++){ 

    char* string = tokenArray[k]; 
    fprintf(newFile, "Tokens are: %s\n", string); 


    if(checkDecimal(string) == 1){ 
     result[k] = "Decimal";  printf("Token: %s is %s\n", string, result[k]); 
    } 

    else if(checkFloat(string) == 1){ 
     result[k] = "Float";  printf("Token: %s is %s\n", string, result[k]); 
    } 

    else if(checkHex(string) == 1){ 
     result[k] = "Hex";  printf("Token: %s is %s\n", string, result[k]); 

    } 

    else if(checkOctal(string) == 1){ 
     result[k] = "Octal";  printf("Token: %s is %s\n", string, result[k]); 

    } 
    else { 

     printf("Token: %s Did not work\n", string);   
    } 

내가이며, 별도의 파일로 내 배열의 내용을 썼다 :

 fprintf(newFile, "Tokens are: %s\n", string); 

토큰은 다음과 같습니다 012

토큰은 다음과 같습니다 : 23,948

토큰은 다음과 같습니다 1.21e + 19

토큰 : [

토큰은 :

토큰은 0

토큰은 : 0x56

토큰은 : 888

토큰은 : 0x11을

토큰은 12

토큰은 다음과 같습니다. 333

토큰은 다음과 같습니다 (234)

토큰은 다음과 같습니다 012

토큰은 다음과 같습니다 12

토큰은 다음과 같습니다 : 01,200

당신은 내가 올바르게 토큰을 얻고있다,하지만 내 출력이 다가오고 볼 수 있듯이 기묘한.

가 출력 나는이 기능을 잘 생각

int checkFloat(char *s){ 

char *str = NULL; 
long i = strtol(s, &str, 0); 

if (!*str) 
    return 0; 


if (*str == 'e' || *str == 'E' || *str == '.') 
    return 1; 


return 0; 
     } 




int checkHex(char *s){ 

char *str = s; 

if((*str) == '0'){ 

    if((*(str++) == 'x')){ 
     printf("%s\n", "olala"); 
    } 
} 
if(*(str) == 0 && (*(str++) == 'x' || *(str++) == 'X')) 
{ 
    printf("%s\n", "ok"); 
    while(*(str) != '\0') 
    { 
     if (!isxdigit(*str)) 
     { 
      return 0; 
     } 
     ++str; 
    } 

    return 1; 
} 

return 0; 
      } 



int checkOctal(char *s){ 

char *str = s; 

if (*str != '0') 
{ 
    return 0; 
} 


while (isdigit(*str) && *str != '8' && *str != '9') 
{ 
    if(*(++str) == '\0') 
    { 
     return 1; 
    } 
    str++; 
} 

return 0; 
     } 




int checkDecimal(char *s){ 

char *str = s; 

if(*str == '0') 
    return 0; 


    for(int i=0;i<strlen(str);i++){ 

     if(str[i] < 49 || str[i] > 57) 
      return 0; 
    } 
    return 1; 
      } 

, :

이 검사 요소에 대한 내 코드입니다

토큰 : 012 진수

입니다

토큰 : 23948은 10 진수입니다.

토큰 : 1입니다.[이

토큰을 작동하지 않았다 : 21E + 19 는

토큰을 플로트입니다

토큰 작동하지 않았다 : 0 진수

입니다

토큰 : 0x56 작동하지 않았다

토큰 : 888은 10 진수입니다.

토큰 : 0X11

,363,210

토큰 : 12 진수입니다

토큰 : (333) 진수입니다

토큰 : 234 작동하지 않았다

토큰 : 012 작동하지 않았다

토큰 : 12 진수

입니다

토큰 : 01200은 8 진수입니다.

As 당신은 볼 수 있습니다, 첫 번째 토큰은 옥타브 (벌금)로 나온 012였습니다. 같은 012를 가진 또 다른 토큰이 오류로 나타났습니다. "234"와 동일합니다.

필자는 왜 내 육면체 주입량이 작동하는지 알지 못합니다.

Plz은 도움말

+2

먼저 디버거를 사용하는 방법을 배우십시오. – OldProgrammer

+0

나는 코드를 디버깅하지 않을 것이지만, 그렇게 할 수 있고 어떤 일이 일어날 지 알 수있다. 당신은 아마 오류를 발견 할 것이다. 동일한 숫자가 같은 결과를 내지 않는다면, 아마도 새로운 라인마다 읽기 포인터를 다시 초기화하지 않을 것입니다. 0x12가 작동하지 않는다면 아마 포인터가 앞으로 올라와 있지 않을 것입니다. 그것이 이루어져서는 안되는 곳으로 나아 간다. 그러나 당신은 혼자서 알아야 할 것입니다, IMO. 좋은 디버거를 사용하십시오. –

+0

참고 : 16 진수 코드는 복잡한 코드입니다. 먼저 '0x'또는 '0X'를 확인한 다음 나머지를 확인하십시오. '0! ='0 ''이나 '0 =='\ 0 ''에주의하십시오. –

답변

1

귀하의 코드의 가장 뛰어난 문제는 '++'(증가)의 사용이다. 테스트하려는 캐릭터를 건너 뛰고 과도하게 사용하는 경향이 있습니다. 예 : 이 잘못된 문자를 찾고으로 두 개의 서로 다른 위치에 포인터를두고 'X'를 테스트하는 데 실패 할 수

(*(str) == 0 && (*(str++) == 'x' || *(str++) == 'X')) 

: 같은 절을보십시오. 이것은 실제로 다음과 같아야합니다.

(*str++ == '0' && (*str == 'x' || *str == 'X')) 

코드가 이러한 유형의 오류로 가득 차 있습니다. (뿐만 아니라 '0'의견에서 언급 한 바와 같이와 혼란 0.) 당신의 단위를 해결 일반적으로 코드를 재 작업 :

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

typedef enum { FALSE = 0, TRUE } boolean; 

int checkFloat(char *s) { 
    char *extra = NULL; 

    (void) strtol(s, &extra, 0); 

    return ((*extra != '\0') && (*extra == 'e' || *extra == 'E' || *extra == '.')); 
} 

int checkHex(char *s) { 
    char *str = s; 

    if (*str++ == '0' && (*str == 'x' || *str == 'X')) { 

     while (*(++str) != '\0') { 
      if (!isxdigit(*str)) { 
       return FALSE; 
      } 
     } 

     return TRUE; 
    } 

    return FALSE; 
} 

int checkOctal(char *s) { 
    char *str = s; 

    if (*str++ != '0') { 
     return FALSE; 
    } 

    while (isdigit(*str) && *str != '8' && *str != '9') { 
     if (*(++str) == '\0') { 
      return TRUE; 
     } 
    } 

    return FALSE; 
} 

int checkDecimal(char *s) { 
    char *str = s; 

    if (*str == '0') { 
      return FALSE; // looks like octal 
    } 

    for (size_t i = 0; i < strlen(str); i++) { 
     if (str[i] < '1' || str[i] > '9') { 
      return FALSE; 
     } 
    } 

    return TRUE; 
} 

char *tokenArray[] = { 
    "012", 
    "12948", 
    "1.21e+19", 
    "[", 
    ",", 
    "0", 
    "0x56", 
    "888", 
    "0X11", 
    "12", 
    "333", 
    "234", 
    "012", 
    "12", 
    "01200" 
}; 

#define TOKEN_COUNT (sizeof(tokenArray)/sizeof(char *)) 

int main() { 

    char *result[TOKEN_COUNT]; 

    for (size_t k = 0; k < TOKEN_COUNT; k++) { 

     char *string = tokenArray[k]; 

     if (checkDecimal(string)) { 
      result[k] = "Decimal"; 
      printf("Token: %s is %s\n", string, result[k]); 
     } else if(checkFloat(string)) { 
      result[k] = "Float"; 
      printf("Token: %s is %s\n", string, result[k]); 
     } else if (checkHex(string)) { 
      result[k] = "Hex"; 
      printf("Token: %s is %s\n", string, result[k]); 
     } else if (checkOctal(string)) { 
      result[k] = "Octal"; 
      printf("Token: %s is %s\n", string, result[k]); 
     } else { 
      printf("Token: %s Did not work\n", string);   
     } 
    } 

    return 0; 
} 

가 생산 : 일반적으로

Token: 012 is Octal 
Token: 12948 is Decimal 
Token: 1.21e+19 is Float 
Token: [ Did not work 
Token: , Did not work 
Token: 0 Did not work 
Token: 0x56 is Hex 
Token: 888 is Decimal 
Token: 0X11 is Hex 
Token: 12 is Decimal 
Token: 333 is Decimal 
Token: 234 is Decimal 
Token: 012 is Octal 
Token: 12 is Decimal 
Token: 01200 is Octal 

스타일을 현명 , 당신은 당신이 좋아하는 들여 쓰기/브라케팅 스타일을 골라야하며 일관되게 붙어 있어야합니다. 코드가 모든 곳에 있습니다.

관련 문제