2010-09-25 93 views
1

我正在編寫一個將二進制字符串轉換爲十進制的程序。我想在我真正開始使用這種方法之前驗證我的輸出。我有以下代碼:C++奇怪的輸出將字符串轉換爲int

int get_val() 
    { 
     int sum =0; 
     for(int num_bits = size; num_bits>0; num_bits--) 
     { 
      printf("String sub %i is %i\n", num_bits, int(bin[num_bits])); 
     } 
    } 

當我輸入16個零的字符串,我得到下面的輸出:

String sub 16 is 24 
String sub 15 is 0 
String sub 14 is 0 
String sub 13 is 0 
String sub 12 is 23 
String sub 11 is 0 
String sub 10 is 0 
String sub 9 is 0 
String sub 8 is 22 
String sub 7 is 0 
String sub 6 is 0 
String sub 5 is 0 
String sub 4 is 21 
String sub 3 is 0 
String sub 2 is 0 
String sub 1 is 0 

爲什麼我敢打賭得到不同的值,如果我輸入全部爲零?

編輯:BIN爲「0000000000000000」

+2

你似乎缺少一些代碼。 – 2010-09-25 21:45:26

+1

什麼是'bin'數組? – 2010-09-25 21:45:46

+2

請問您可以發佈代碼的其餘部分,特別是bin []是什麼? – schnaader 2010-09-25 21:45:53

回答

1

只要不更新的問題,也許這個例子的代碼有幫助。它將二進制字符串轉換爲整數。我儘量保留儘可能多的代碼和變量名稱。

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

using namespace std; 

int main() { 
    string bin = "000111010"; 
    int size = bin.length(); 
    int sum = 0; 
    for(int num_bits = 1; num_bits <= size; num_bits++) { 
     sum <<= 1; 
     sum += bin[num_bits - 1] - '0'; 
    } 
    printf("Binary string %s converted to integer is: %i\n", bin.c_str(), sum); 
} 

前面已經說過的意見,這裏主要的竅門是轉換成ASCII字符「0」和「1」到減去「0」值來完成整數0和1。另外,我改變了字符串的遍歷順序,因爲這樣可以在每一位之後移動整數,並且總是設置當前最低位的值。

0

簡短的回答,你不會。

很長的答案,這裏有幾個問題。第一個大問題是,如果我們假設bin是長度爲「size」的標準字符數組,那麼您的第一個打印是無效的。數組的索引是關閉的1。考慮代碼示例:

int size = 16; 
char * bin = new char[size]; 

for(int i=0; i<size; i++) 
{ 
    bin[i] = 0; 
} 

for(int num_bits = size; num_bits>0; num_bits--) 
{ 
    printf("String sub %i is %i\n", num_bits, int(bin[num_bits])); 
} 

主要生產:

String sub 16 is -3 
String sub 15 is 0 
String sub 14 is 0 
String sub 13 is 0 
String sub 12 is 0 
String sub 11 is 0 
String sub 10 is 0 
String sub 9 is 0 
String sub 8 is 0 
String sub 7 is 0 
String sub 6 is 0 
String sub 5 is 0 
String sub 4 is 0 
String sub 3 is 0 
String sub 2 is 0 
String sub 1 is 0 

通過你得到了實際產量來看,我猜你不喜歡的東西:

int size=16; 
int * ints = new int[size]; 
char * bin; 

//Fill with numbers, not zeros, based on the evidence 
for(int i=0; i<size; i++) 
{ 
    ints[i] = 20 + i; 
} 

//Copy over to character buffer 
bin = (char*)(void*)&(ints[0]); 

for(int num_bits = size; num_bits>0; num_bits--) 
{ 
    printf("String sub %i is %i\n", num_bits, int(bin[num_bits])); 
} 

這解釋了您完美看到的輸出。所以,我在考慮你的輸入假設,即bin指向一組字符零,這是不正確的。這有幾個很大的問題,假設你做了這樣的事情。

  1. 你的假設內存是所有零是錯誤的,你需要解釋或發佈真正的代碼,我們將
  2. 你不能只是把一個整數的內存緩衝區的字符 - 字符串是由一個字節的字符(典型的),整數是4個字節,典型地
  3. 陣列在C++中從0開始,而不是1
  4. 鑄造一個字符的整數[INT(「0」)]不智能地轉換 - 出來的整數是小數點48,而不是小數點0(有一個函數atoi會這樣做,以及其他更好的函數,或者其他建議使用減法)