二进制字符串转十进制

问题描述 投票:0回答:1

我尝试将二进制字符串转换为十进制并使用以下函数。

只要二进制字符串是 32 位长,它就可以正常工作。但在那之后它不会产生正确的结果。例如,注释为无效的二进制字符串。

谁能帮我找到问题所在?

#include <stdio.h>

// converts binary string to integer decimal number
size_t strBinaryToDecimal(char* s)
{
    char        c;
    char   *p = s;
    size_t  r = 0;

    while (p && *p)
    {
        c = *p++;

        if      ( c == '0' ) { r = (r<<1)     ; } // shift 1 bit left and add 0
        else if ( c == '1' ) { r = (r<<1) + 1 ; } // shift 1 bit left and add 1
        else                 { break          ; } // bail on invalid character
    }
    return (size_t)r;
}

int main(void)
{
    char reading[32] = "10011001100110011001100110011001";
    // char reading[33] = "100110011001100110011001100110011"; // not working correctly

    printf("Binary: %s\n", reading);
    printf("Decimal: %zu\n", strBinaryToDecimal(reading));

  return 0;
}

我尝试将十进制整数类型更改为size_t。但它没有用。

c binary type-conversion decimal
1个回答
0
投票
  1. 计算机的计算能力非常好,您不需要自己计算字符串所需的大小。你的实际上太短了,不包含空终止符,这是未定义的行为
  2. size_t
    在 C 中有特定的功能
  3. 如果不更改参数或变量,请使用
    const
unsigned long long strBinaryToDecimal(const char* p)
{
    unsigned long long result = 0;
    if(p)
        while(*p)
        {
            result <<= 1;
            if(*p == '0' || *p == '1') result += *p == '1';
            else return -1;
            p++;
        }
    return result;
}

int main(void)
{
    char reading[] = "10011001100110011001100110011001";

    printf("Binary: %s\n", reading);
    printf("Decimal: %llu\n", strBinaryToDecimal(reading));
}
© www.soinside.com 2019 - 2024. All rights reserved.