我需要将字符串“12345678”转换为值 00010010001101000101011001111000(二进制值只有左边没有零)。 所以我用 c 语言编写了这段代码,问题是当我运行它时它什么都不做,就像有错误一样等待,直到我手动停止它。 有什么想法吗?
#include <stdio.h>
#include <string.h>
void reduce(char string[]) {
int i=0, j=0, k=0, cnt=0, tmp=4, num;
char arr[4], result[4*strlen(string)];
for (i=0; i<strlen(string); i++) {
num = atoi(string[i]);
while (num != 0) {
arr[j++] = num%2;
num = num/2;
tmp--;
}
while (tmp != 0) {
arr[j++] = 0;
tmp--;
}
j--;
for (k=i*4; k<(i*4+4); k++) {
result[k++] = arr[j--];
}
j = 0;
tmp = 4;
}
printf("The result is: \n");
for (i=0; i<4*strlen(result); i++) {
printf("%d",result[i]);
}
printf("\n");
}
int main() {
char c[8] = "12345678";
reduce(c);
return 0;
}
最佳答案
您的代码中有很多小错误,这使得很难查明单个错误。主要问题似乎是您混淆了二进制数 (0
, 1
) 和 ASCII 数字 ("0"
, "1"
) 并且误用了字符串函数。
- 如其他地方所述,
char c[8] = ..
是错误的。 atoi(string[i])
无法工作;它需要一个 string,而不是 char。使用 `num = string[i]-'0';arr[..]
获取值'num%2
,即一个数值。最好使用'0'+num%2
这样它就是一个字符串。- 您在
result[k++]
中递增k
,在一个已经递增k
的循环中
- 在打印前的末尾添加
result[k] = 0;
,这样strlen
就可以正常工作了 4*strlen(result)
太多了——strlen
就是这样。- 你不妨做一个简单的
printf("%s\n", result);
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void reduce(char string[]) {
int i=0, j=0, k=0, cnt=0, tmp=4, num;
char arr[5], result[4*strlen(string)+1];
for (i=0; i<strlen(string); i++) {
num = string[i]-'0';
while (num != 0) {
arr[j++] = '0'+num%2;
num = num/2;
tmp--;
}
while (tmp != 0) {
arr[j++] = '0';
tmp--;
}
arr[j] = 0;
j--;
for (k=i*4; k<(i*4+4); k++) {
result[k] = arr[j--];
}
j = 0;
tmp = 4;
}
result[k] = 0;
printf("The result is: \n");
for (i=0; i<strlen(result); i++) {
printf("%c",result[i]);
}
printf("\n");
}
int main() {
char c[] = "12345678";
reduce(c);
return 0;
}
..导致
The result is:
00010010001101000101011001111000
关于将十进制数的每一位转换为相应的二进制数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27400423/