将字符串转换为二进制,然后计算未设置的位数
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;
}
在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 将执行写入。
在 (void)
- 缺少必需的 headers。
int main
. 之后缺少 您可以直接计算字符中的位,而不是将字符串转换为二进制字符串:
#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;
}