我尝试将二进制字符串转换为十进制并使用下面的函数。
只要二进制字符串长度为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。但是没有成功。
- 计算机在计算方面相当好,你不需要自己计算字符串所需的大小。您的代码太短,不包含空终止字符,这是未定义行为
size_t
在C 中具有特定的功能- 如果不更改参数或变量,则使用
const
- 你不需要在每次迭代时检查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));
}