2015-04-03 94 views
0

我得到了下面的代碼把整型變量手動

int main() 
{ 
    string data; 
    int x; 
    cin >> x; 

    if (x < 0) 
    { 
     data = to_string(x); 
    } 
    else 
    { 
     data = to_string(x); 
    } 
    return 0; 
} 

如果我不希望使用to_string(x)一個快速的問題,而不是我想這樣做手工的東西。無論如何,我可以做到這一點?如果我使用data = x;這顯然是行不通的。

ps。我不希望使用任何atoi

回答

1

你可以做到以下幾點:

int main(){ 
    int x; 
    cin>>x; 
    string s = "";  // s will represent x but with the digits reversed 
    bool neg = 0;  // this flag is 1 if x is negative and 0 if positive. 
         // we will use it to find out if we should put a "-" before the number 
    if(x < 0){ 
     neg = 1; 
     x *= -1;  // making the number positive 
    } 
    while(x){ 
     char c = '0' + x % 10;   // c represent the least significant digit of x 
     s.push_back(c);     // adding c to s    
     x /= 10;      // removing the least significant digit of x 
    } 
    string ans = "";     // ans is our resulting string 
    if(neg) ans.push_back('-');   // adding a negative sign if x was negative 
    for(int i=s.size() - 1; i >= 0; i--) // adding the characters of s in reverse order 
     ans.push_back(s[i]); 
} 
+0

如果'的std :: to_string'沒有按

#include <sstream> string intToString(int x) { stringstream stream; stream << x; return stream.str(); } 

或者沒有資格作爲「手動」,我不明白這是怎麼回事。 – chris 2015-04-03 00:50:13

+0

對不起,我沒注意。我將修改我的代碼。 – MrGreen 2015-04-03 00:51:27

+0

將數字倒序的原因是什麼? – kybookie 2015-04-03 01:14:34

1

這可能是足夠的。

string convertInt(int number) 
{ 
    if (number == 0) 
     return "0"; 
    string temp=""; 
    string returnvalue=""; 
    while (number>0) 
    { 
     temp+=number%10+'0'; 
     number/=10; 
    } 
    for (int i=0;i<temp.length();i++) 
     returnvalue+=temp[temp.length()-i-1]; 
    return returnvalue; 
} 

(我沒有寫這個功能,但發現它做一個quick Google search。原帖is here

此功能通過將數字10。它採用除法的餘,它將始終在0和9之間。然後通過將字符0的整數值加上它來「找到」表示該數字的字符。

接下來,它採用該除法的商,並一次又一次地執行相同的操作,直到商爲零。

這會產生一個字符串,其中包含代表數字的字符,但是按相反的順序。最後一個循環在返回之前反轉字符串。

克里斯在下面的評論所指出的,從0到9,保證數字是按順序

N3485,§2.3[lex.charset]/3:在源極和執行基本都 字符集,在上面的列表 的十進制數字中的0之後的每個字符的值應該大於先前的值。 (上面的列表很直觀,0 1 2 3 4 5 6 7 8 9)。

這裏是關於字符串操作良好的閱讀材料:The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

+0

不知道爲什麼反對票。正如OP問到的那樣,沒有真正調用另一個功能來完成這項工作。 – Steve 2015-04-03 00:54:17

+1

我沒有投票,但可以看到它爲什麼。該代碼假定一個特定的字符集(ASCII),並不會與其他人一起工作。做這項工作的方法也少得多。 – Peter 2015-04-03 00:57:59

+0

我可以理解這一點,並在答案中予以澄清。 – Steve 2015-04-03 00:59:28

0

在任何數量的鹼手動格式化的整數並不難。例如。在基地10:

void print(int n) 
{ 
    if (n == 0) { std::cout << '0'; return; } 
    if (n < 0) { std::cout << '-'; n = -n; } 

    std::string buf; 
    while (n != 0) { buf += '0' + n % 10; n /= 10; } 
    for (auto it = buf.rbegin(); it != buf.rend(); ++it) 
     std::cout << *it; 
} 

如果您的號碼基數十時,你必須提供一個合適的字母,並使用n % base枚舉所需的數字。

如果要避免重新分配,可以預留字符串中的容量,並且可以通過取適當的對數n來計算所需的容量。

+0

[Demo](http://ideone.com/tYQCMe) – 2015-04-03 00:57:07

0

如果你真的必須提取數字自己

std::string manual_convert(int value) 
{ 
    if (x < 0) 
     return std::string("-") + manual_convert(-x); // handle negative values (except potentially INT_MIN) 
    else if (x == 0) 
     return "0"; 

    std::string retval; 
    while (x > 0) 
    { 
     char digit = x%10 + '0';  // extract the proverbial digit 
     retval.append(1, digit); 
     x /= 10;      // drop the digit, and prepare for next one 
    } 

    std::reverse(retval.begin(), retval.end()); // loop above extracted digits in reverse order 
    return retval; 
} 
0

兩種簡單的方法:如果你使用boost庫

string str = lexical_cast<string>(x)