【问题标题】:C++ strange output converting string to intC ++奇怪的输出将字符串转换为int
【发布时间】:2010-09-25 21:42:12
【问题描述】:

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

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”

【问题讨论】:

  • 您似乎遗漏了一些代码。
  • bin 数组是关于什么的?
  • 能否请您发布其余代码,尤其是 bin[] 是什么?
  • 如果要将二进制字符串转换为int,为什么不使用:(int)strtol(bit_string, NULL, 2);?除非这是家庭作业(或类似的东西),否则编写自己的例程似乎毫无意义。
  • 您的编辑没有帮助。向我们展示您的bin 是如何声明和初始化的。 size 是什么?

标签: c++ string integer


【解决方案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);
}

正如在 cmets 中已经说过的,这里的主要技巧是将 ASCII 字符 '0' 和 '1' 转换为整数 0 和 1,这是通过减去 '0' 的值来完成的。另外,我更改了字符串的遍历顺序,因为这样,您可以在每个位之后移动整数并始终设置当前最低位的值。

【讨论】:

    【解决方案2】:

    简短的回答,你不会。

    长答案,这有一些问题。第一个大问题是,如果我们假设 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 函数可以做到这一点,如以及其他更好的,或其他使用减法的建议)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-13
      • 1970-01-01
      • 2021-10-29
      相关资源
      最近更新 更多