C ++奇怪的输出将字符串转换为int

时间:2010-09-25 21:42:12

标签: c++ string integer

我正在编写一个将二进制字符串转换为十进制的程序。在我真正开始使用此方法之前,我想验证输出。我有以下代码:

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 个答案:

答案 0 :(得分: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和1,这是通过减去'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会这样做,如以及其他更好的,或使用减法的其他建议)