1. 程式人生 > >將字串轉換成十進位制數字

將字串轉換成十進位制數字

         這兩天做的一個專案需要將十進位制字串(只含'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