将字符串转换为二进制,然后计算未设置的位数

Convert a string to binary and then count the number of unset bits

在C中,我想取一个字符串(来自用户),逐位扫描,并打印出未设置的位数。字符串长度不会大于 127。我还想排除字符串末尾的空字符。对于字符串“hi”,我的输出是 25,尽管它应该是 9。不确定我做错了什么。

int unset(char* s){
    size_t len = strlen(s);
    char *bin = malloc(len*8);
    char x;

    bin[0] = '[=10=]';

    for(int i=0; i<=len; ++i) { //convert the string to binary
        if (s[i] != '[=10=]'){ 
            x = s[i];
            for(int j=7; j>=0; --j){
                if((x & (1 << j)) == 0) {
                    strcat(bin,"0");
                }
                else {
                    strcat(bin,"1");
                }
            }
        }
        else {
            break;
        }
    }
    int n = strtol(bin, NULL, 2);
    int count = 0;
    for(int i=0; i<INT_SIZE; i++){ //count the unset bits
        if((n & 1) == 0){
            ++count;
        }
        n >>= 1;
    }
    return count;
}

int main{
    char sen[128];
    printf("String: ");
    scanf("%s", sen);

    printf("%d", unset(sen));
    return 0; 
}

你的错误是:

  • 您正在数 00000000 00000000 01011000 01101001 的零个。 (只读了 2 个字符,但您似乎在计算完整 int
  • 127 个字节太长,无法放入 int
  • 分配给 bin 的缓冲区没有终止 null-character 的空间,但 strcat() 会添加它。因此 out-of-bound 将执行写入。
  • int main. 之后缺少
  • (void)
  • 缺少必需的 headers。

您可以直接计算字符中的位,而不是将字符串转换为二进制字符串:

#include <stdio.h>

int unset(const char* s){
    int count = 0;
    while(*s != '[=10=]'){
        for(int i=7; i>=0; --i){
            if((*s & (1 << i)) == 0) count++;
        }
        s++;
    }
    return count;
}

int main(void){
    char sen[128];
    printf("String: ");
    scanf("%127s", sen);

    printf("%d", unset(sen));
    return 0; 
}