【发布时间】:2012-03-09 23:37:04
【问题描述】:
这可能是一个愚蠢的问题,但我似乎无法弄清楚。
我编写了一个程序,它将一个字符作为输入,输出字符及其十六进制值,然后检查偶校验并将奇偶校验位设置为 1,然后再次输出“新”字符及其十六进制值。然而,使用 printf 和 %c 似乎不是要走的路,我不明白为什么或如何解决它,所以如果有人能解释为什么不这样做以及我应该做什么,我将非常感激。哦,请随意评论我正在学习的代码,所以批评总是好的:)
int checkParity(unsigned char myChar); //returns 0 if even 1 if odd
int main() {
int i;
unsigned char input;
printf("Enter char: ");
scanf("%c", &input);
/* print unchanged char and hex with */
printf("c7: %c ", input);
printf("hex: %x \n", input);
/*if parity is odd*/
if(checkParity(input)){
/*change to even*/
input = (input|0x80);
}
/* print char and hex even parity */
printf("c8: %c ", input);
printf("hex: %x \n", input);
return 0;
}
int checkParity(unsigned char myChar){
int i;
int parity = 0;
while(myChar){ //while myChar != 0
parity += (myChar&1); //add result of myChar AND 1 to parity
myChar = myChar>>1; //shift bits left by 1
}
//printf("parity equals: %d\n", parity);
if(parity%2){ // if odd parity
return 1;
}
else { //even parity
return 0;
}
}
【问题讨论】:
-
输出是什么,你期望它是什么?
-
添加奇偶校验位后,我只想打印输入的字符,例如“L”后跟新的十六进制值。现在它打印出一个看起来很奇怪的正方形而不是 L。
-
除了 >> 是右移而不是左移这一事实之外,请尝试将您的问题集中在不工作的部分代码上。例如,我不知道你是否检查校验函数的行为
-
那是因为它不再是“L” :-) 奇偶校验位恰好是最高有效位,它被视为数据。所以你实际上是在字符的十六进制代码中添加 128。搜索“扩展 ASCII 表”以找出新字符是什么。如果要打印原始字符,可以将其复制到另一个变量中并打印。
-
哎呀谢谢没注意到我写的左边!好吧,我检查了 checkParity 函数几次,它似乎。就像我提到的那样,不起作用的部分是使用 %c 打印一个奇偶校验位设置为 1 的字符。我们的讲师提到它不起作用,但我不知道为什么。
标签: c