因此,我正在尝试创建一个程序,在该程序中,用户输入12位二进制汉明码序列(例如“ 100010010001”),并且应打印出其相应的ASCII字符,在这种情况下为“ A”。
我正在尝试让我的程序忽略位于_ _ 0 _ 1 0 0 _ 0 0 0 1 1中的4个奇偶校验位,并将其他8位移到一起。在else语句中,我尝试将剩余的8位转换为字符。但是,当我尝试运行该程序时,键入二进制序列并按Enter键后,程序将崩溃。这是我正在努力的程序的一部分,我想知道是否有人可以帮助我或向我提示我做错了什么?
char charToBin(char usersInput[]) {
char c = " ";
for (int i = 12; i >= 0; i--) {
if((i == 0) || (i == 1) || (i == 3) || (i == 7)){
usersInput[i] = usersInput[i + 1];
}else{
c = strtol(usersInput[i], (char **)NULL, 2);
}
}
return c;
}
答案 0 :(得分:0)
if((i == 0) || (i == 1) || (i == 3) || (i == 7)){
usersInput[i] = usersInput[i + 1];
}else{
在这里,如果您是if(条件),那之后的大括号是不必要的。
if((i == 0) || (i == 1) || (i == 3) || (i == 7))
usersInput[i] = usersInput[i + 1];
else{
也许会解决
答案 1 :(得分:0)
您的程序有两个编译错误:
修复编译错误后,需要对逻辑进行两个修复: 1.从左到右执行输入字符串的过滤,以避免将位置12复制到11,将11复制到10,这将导致复制最后的位置。需要一个额外的计数器来帮助压缩。 2.输入完全压缩后,执行一次strtol。
char charToBin(char usersInput[]) {
char j = 0 ;
// Copy relevant input positions, INCLUDING terminating NUL byte at position 12.
for (int i = 0; i <= 12 ; i++) {
if((i == 0) || (i == 1) || (i == 3) || (i == 7)){
continue ;
} ;
usersInput[j] = usersInput[i] ;
j++ ;
} ;
char c = strtol(usersInput, (char **)NULL, 2);
return c;
}
答案 2 :(得分:0)
对于您的代码,不能乱用“ strtol”。您提供给“ strtol”的char数组不能以“ \ 0”结尾。同样,不管您做什么,数组都将始终具有12个索引,除非您将“ \ 0”复制到索引9,以便“ strtol”知道它是输入的结尾。
此外,有时循环不是最好的。对于您的情况,您已经知道要使用多少个索引。使用循环没有意义。尽管如此,我还是编写了两种方法,并在下面提供了测试代码作为示例。
#include <stdio.h>
/*
* This function generate a hammer binary digit string for testing.
* It does not care about the validity of the hammer bit.
* The array that is passed to this function should be the length of 12.
*/
void generateChar(int value, char * output){
output[0] = '0';
output[1] = '0';
output[3] = '0';
output[7] = '0';
output[2] = (value & 0b10000000) > 0? '1' : '0';
output[4] = (value & 0b01000000) > 0? '1' : '0';
output[5] = (value & 0b00100000) > 0? '1' : '0';
output[6] = (value & 0b00010000) > 0? '1' : '0';
output[8] = (value & 0b00001000) > 0? '1' : '0';
output[9] = (value & 0b00000100) > 0? '1' : '0';
output[10] = (value & 0b00000010) > 0? '1' : '0';
output[11] = (value & 0b00000001) > 0? '1' : '0';
}
/*
* First method.
*
*/
char charToBin(char usersInput[]) {
char c = 0;
c = usersInput[2] == '1'? c | 0b10000000 : c;
c = usersInput[4] == '1'? c | 0b01000000 : c;
c = usersInput[5] == '1'? c | 0b00100000 : c;
c = usersInput[6] == '1'? c | 0b00010000 : c;
c = usersInput[8] == '1'? c | 0b00001000 : c;
c = usersInput[9] == '1'? c | 0b00000100 : c;
c = usersInput[10] == '1'? c | 0b00000010 : c;
c = usersInput[11] == '1'? c | 0b00000001 : c;
return c;
}
/*
* Second method.
*/
char charToBin2(char usersInput[]) {
char temp[9];
int pos = 0;
temp[8] = '\0'; // Protect from overflow.
for ( int i = 2; i < 12; i++ ){
if ( i == 3 || i == 7 ) continue;
temp[pos] = usersInput[i];
pos++;
}
return (char) strtol(temp, (char **)NULL, 2);
}
int main(){
char a[] = "100010010001";
char t[12];
int b;
// Test for method 1
for ( int i = 0; i < 256; i++ ){
generateChar(i, t);
b = charToBin(t);
printf("%d ", (unsigned char) b );
}
printf("\n\n");
// Test for method 2
for ( int i = 0; i < 256; i++ ){
generateChar(i, t);
b = charToBin2(t);
printf("%d ", (unsigned char) b );
}
return 0;
}
答案 3 :(得分:0)
或者,您可以使用位操作。像这样:
char charToBin(char usersInput[]) {
unsigned c = strtol(usersInput, NULL, 2);
unsigned part1 = c & 0xFu;
unsigned part2 = c >> 1u & 0x70u;
unsigned part3 = c >> 2u & 0x80u;
return (char) (part1 | part2 | part3);
}
您愿意输入
char userInput[] = "100010010001";
char ch = charToBin(userInput);
printf("result: %c(%d)\n", ch, ch);
控制台上的以下输出:
result: A(65)