2016-07-04 59 views
-2

我想要一個字符串,看看它是否可以轉換成十進制/浮點/八進制/十六進制將字符串轉換爲十進制,不適用於某些情況?

我已經將這些字符串存儲到一個數組中,並通過它們遍歷並檢查哪些元素是什麼。

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

令牌是:23948個

令牌是:1.21E + 19

代幣有:[

令牌是:,

令牌是:0

令牌是:0x56儲存

令牌是:888

令牌是:0X11

令牌是:12

代幣有:333

令牌是:234

令牌是:012

令牌是:12

令牌是:01200

正如你能看到我的正確獲得令牌,但我的輸出快到了奇怪的。

這是我的檢查元素代碼:

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是十進制

令牌:1。21E + 19 是浮法

令牌:沒有工作

令牌:,沒有工作

令牌:0是八路

令牌:0x56儲存沒有工作

令牌:888是十進制

令牌:0X11 沒有工作

令牌:12是十進制

令牌:333是十進制

令牌:234 沒有工作

令牌:012 沒有工作

令牌:12是十進制

令牌:01200是八進制

As你可以看到,第一個令牌是012,它以八進制(罰款)形式出現。另一個相同的標記012出來的錯誤。與「234」相同。

我不知道爲什麼我的十六進制數字劑量工作。

Plz help

+2

請花一些時間學習如何使用調試器。 – OldProgrammer

+0

我不打算調試你的代碼,但你可以這樣做,看看會發生什麼。你可能會發現錯誤。如果相同的數字不會產生相同的結果,那麼您可能不會重新初始化每個新行的讀取指針,並且如果0x12不起作用,那麼您可能不會將讀取指針前進到應該出現的位置,或者您推進它不應該在的地方。但你必須自己找出IMO。使用一個好的調試器。 –

+0

注意:你的十六進制代碼是複雜的。首先檢查「0x」或「0X」,然後檢查其餘部分。注意'0!='0',但是'0 =='\ 0''。 –

回答

1

您的代碼最突出的問題是您使用'++'(增量)。你傾向於過度使用它,跳過你想要測試的角色。例如。考慮像一個條款:

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

它可以給在兩個不同位置的指針,並未能測試「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 

一般來說,風格明智,你應該選擇你喜歡的縮進/包圍風格,並堅持使用它 - 你的代碼遍佈各處。

相關問題