c -二进制字符串到十进制的转换



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

只要二进制字符串长度为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: %sn", reading);
printf("Decimal: %zun", strBinaryToDecimal(reading));
return 0;
}

我尝试将十进制整数类型更改为size_t。但是没有成功。

  1. 计算机在计算方面相当好,你不需要自己计算字符串所需的大小。您的代码太短,不包含空终止字符,这是未定义行为
  2. size_t在C
  3. 中具有特定的功能
  4. 如果不更改参数或变量,则使用const
  5. 你不需要在每次迭代时检查NULL指针
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; //indicate error
p++;
}
return result;
}
int main(void)
{
char reading[] = "10011001100110011001100110011001";
printf("Binary: %sn", reading);
printf("Decimal: %llun", strBinaryToDecimal(reading));
}

最新更新