將字串轉換成十進位制數字
這兩天做的一個專案需要將十進位制字串(只含'0'--'9' )轉換成相應的數字。比如將“123456789”轉換成數字123456789。要求只轉換指定長度而不是轉換到字串的結束‘\0’。在網上搜到了比如StrToInt()等都是處理字串到字串結束而且不知道那些函式能不能判斷溢位,比如對於32位機來說4294967295是無符號整型能表示的最大數,如果所給的字串超出了上述範圍函式能不能判斷出來。一個很簡單的方法是用 sscanf 函式或者atoi函式,如下:
char a[] = "4294967295"; unsigned int i; sscanf(a, "%d", &i);// 或者 i = atoi(a); printf("i = %u\n", i);
缺點就是如果要轉換的字串表示的數超出了範圍sscanf函式會自動截斷。也就是說如果字串是“4294967296”,轉換後i=0。而且轉換前還需要把要轉換的字串賦給一個字元陣列。優點是它可以轉換小數等其他功能。當然可以改進,可以判斷溢位,但判斷不出非法字元:
// 將前面的'0'去掉 char p[] = "4294967295"; char *a = p; while (*a == '0') { ++a; } unsigned int maxUINT = 0xFFFFFFFF; char b[11]; unsigned int result; sprintf(b, "%u", maxUINT); if (strcmp(a, b) > 0) { printf("溢位!\n"); } else { sscanf(a, "%u", &result); printf("result = %u\n", result); }
一般情況下用sscanf足夠了。為了玩,我另寫了一個函式。雖然效率差了許多但還勉強過得去。我沒有用sscanf和sprintf,下面是程式碼。引數len是要轉換的字元個數。
unsigned int StrToDec(const char *str, int len) { while (*str == '0') { str++; len--; } unsigned int maxUINT = 0xFFFFFFFF; // 32位機integer最大能表示十位 if (len > 10) { printf("溢位!\n"); return 0; } unsigned int tmpResult = 0; if (len < 10) { while (len-- > 0) { tmpResult *= 10; if (*str >= '0' && *str <= '9') { tmpResult += (*str) - '0'; } else { printf("字串出現非法字元!\n"); return 0; } str++; } return tmpResult; } else { unsigned int tmpQuotient = 0;// 商 unsigned int tmpRemainder = 0;// 餘數 if (*str >= '0' && *str <= '9') { tmpResult += (*str) - '0'; } str++; while (len-- > 1) { if (*str >= '0' && *str <= '9') { tmpQuotient = maxUINT / (unsigned int)pow(10, len); tmpRemainder = maxUINT % (unsigned int)pow(10, len); if ((tmpResult < tmpQuotient) || ((tmpResult == tmpQuotient) && (*str - '0' <= tmpRemainder / pow(10, len - 1)))) { tmpResult *= 10; tmpResult += (*str) - '0'; str++; } else { printf("溢位!\n"); return 0; } } else { printf("字串出現非法字元!\n"); return 0; } } return tmpResult; } }
十進位制字串(只含'0'--'9' )的溢位判斷有點複雜,十六進位制字串(含'0' -- '9'以及'a' -- 'f'或'A'--'F')的溢位判斷就相對簡單了:
unsigned int HexStrToDec(const char *str, int len)
{
// 32位機
if (len > 8)
{
return 0;
}
unsigned int tmpResult = 0;
while (len-- > 0)
{
tmpResult <<= 4;
if (*str >= '0' && *str <= '9')
{
tmpResult |= *str - '0';
}
else if(*str >= 'A' && *str <= 'F')
{
tmpResult |= *str - 'A' + 10;
}
else if(*str >= 'a' && *str <= 'f')
{
tmpResult |= *str - 'a' + 10;
}
str++;
}
return tmpResult;
}
//下面是我在網上找的一位大牛用C++實現的,方法很簡便,缺點是處理大量資料轉換速度較慢。用C++的stringstream:
#include <sstream>
#Include <string>
string num2str(double i)
{
stringstream ss;
ss << i;
return ss.str();
}
int str2num(string s)
{
int num;
stringstream ss(s);
ss >> num;
return num;
}
The End.
<pre name="code" class="cpp">
相關推薦
將字串轉換成十進位制數字
這兩天做的一個專案需要將十進位制字串(只含'0'--'9' )轉換成相應的數字。比如將“123456789”轉換成數字123456789。要求只轉換指定長度而不是轉換到字串的結束‘\0’。在網上搜到了比如StrToInt()等都是處理字串到字串結束而且不知
將十六進位制字串轉換成十進位制數字
Write a function that parses a hex number as a string into a decimal integer. The function header is as follows: int parseHex(co
十六進位制字串轉換成十進位制數字
int ChangeNum(char* str, int length){char revstr[16] = { 0 }; //根據十六進位制字串的長度,這裡注意陣列不要越界 int num[16] = { 0 };int count = 1;int res
C語言將字串轉換成對應的數字(十進位制、十六進位制)
問題1:講一個十進位制數字的字串表示轉換成對應的整數。舉例:將“1234”轉換成整數1234./*將字串s轉換成相應的整數*/ int atoi(char s[]) { int i = 0; int n = 0; for (i =
將資料型別轉換成字串,將字串轉換成資料型別
方法1:採用靜態方法 int a = 123456789; String str = String.valueOf(a); 方法2:用包裝類轉換 float a=2.33f; String str=Float.toString(a); doubl
習題7-8 字串轉換成十進位制整數 (15 point(s))
習題7-8 字串轉換成十進位制整數 (15 point(s)) 輸入一個以#結束的字串,本題要求濾去所有的非十六進位制字元(不分大小寫),組成一個新的表示十六進位制數字的字串,然後將其轉換為十進位制數後輸出。如果在第一個十六進位制字元之前存在字元“-”,則代表該數是負數。 輸入格式: 輸
java如何將字串轉換成日期格式
先用parse轉成date型,再用format轉成string。 public static void main(String[] args) throws Exception{ Date date = new SimpleDateFormat(“yyyy-MM
java將字串轉換成集合
程式碼展示 @Test public void test23(){ Set<String> set = new HashSet<>(); set.add("aaaa"); set.a
7-5 字串轉換成十進位制整數 (15 分) 測試點 2 測試
7-5 字串轉換成十進位制整數 (15 分) 輸入一個以#結束的字串,本題要求濾去所有的非十六進位制字元(不分大小寫),組成一個新的表示十六進位制數字的字串,然後將其轉換為十進位制數後輸出。如果在第一個十六進位制字元之前存在字元“-”,則代表該數是負數。 輸入格式: 輸
字串轉換成十進位制整數 十六進位制轉換十進位制
字串轉換成十進位制整數 (15分) 輸入一個以#結束的字串,本題要求濾去所有的非十六進位制字元(不分大小寫),組成一個新的表示十六進位制數字的字串,然後將其轉換為十進位制數後輸出。如果在第一個十六進位制字元之前存在字元“-”,則代表該數是負數。
劍指offer之將字串轉換成整數(Java實現)
將字串轉換成整數 NowCoder 題目描述: 將一個字串轉換成一個整數(實現Integer.valueOf(string)的功能,但是string不符合數字要求時返回0),要求不能使用字串轉換整數的庫函式。 數值為0或者字串不是一個合法的數值則返回0。 輸入描述: 輸入一個
字串轉換成十進位制整數 (15分)
輸入一個以#結束的字串,本題要求濾去所有的非十六進位制字元(不分大小寫),組成一個新的表示十六進位制數字的字串,然後將其轉換為十進位制數後輸出。如果在第一個十六進位制字元之前存在字元“-”,則代表該數是負數。 輸入格式: 輸入在一行中給出一個以#結束的非空字串。 輸出格式:
7-8 字串轉換成十進位制整數
//字串轉換成十進位制整數 #include<stdio.h> int main() { int i=0; char str[80]; printf("Enter a string:"); while((str[i]=getchar())!='#')
C#將字串轉換成XML格式
【整理, 內容來源於網路及本人實踐】 前幾天寫程式的時候,遇到一個問題,我需要返回一個字串給同事,其內容是XML的標記。但是同事在日誌裡翻看記錄的時候,發現整個xml中沒有一個換行回車,導致他看的時候太難受。於是要求我返回的時候先把字串處理成一個具有xml格式的串,再返回給
陣列-08. 字串轉換成十進位制整數(15)
輸入一個以#結束的字串,本題要求濾去所有的非十六進位制字元(不分大小寫),組成一個新的表示十六進位制數字的字串,然後將其轉換為十進位制數後輸出。如果過濾後字串的首字元為“-”,代表該數是負數。 輸入格式: 輸入在一行
C++將字串轉換成大寫、小寫的函式的程式碼
把寫內容過程較好的內容備份一次,下面內容段是關於C++將字串轉換成大寫、小寫的函式的內容,希望能對碼農有所幫助。 #include <string> std::string toLower( std::string str ){ for ( int i = 0; i < str.lengt
5-1 字串轉換成十進位制整數 (15分) (這是補上的7月6號)
5-1 字串轉換成十進位制整數 (15分) 輸入一個以#結束的字串,本題要求濾去所有的非十六進位制字元(不分大小寫),組成一個新的表示十六進位制數字的字串,然後將其轉換為十進位制數後輸出。如果在第一個十六進位制字元之前存在字元“-”,則代表該數是負數。 輸入
習題7-8 字串轉換成十進位制整數 (十六進位制字元)
輸入一個以#結束的字串,本題要求濾去所有的非十六進位制字元(不分大小寫),組成一個新的表示十六進位制數字的字串,然後將其轉換為十進位制數後輸出。如果在第一個十六進位制字元之前存在字元“-”,則代表該數是負數。 輸入格式: 輸入在一行中給出一個以#結束的非空字串。 輸出格式: 在一行中
python 將字串轉換成字典dict的各種方式
1)利用eval可以將字典格式的字串與字典戶轉 》》》mstr = '{"name":"yct","age":10}' 轉換為可以用的字典 》》》eval(mstr), type( eval(mstr) ) {"name":"yct","age":10}, d
js將字串轉換成物件和陣列
一個物件,但如何把文字轉為物件呢。使用eval();注意一定要加括號,否則會轉換失敗 程式碼如下:var test='{ colkey: "col", colsinfo: "NameList" }'把文字轉化為物件var test='{ colkey: "col", col