结果不对
#include
#define MAX 1000 //一个十六进制的最大位数
int main(){
int cov(char s[]);
char num[MAX]; //输入的16进制数 (字符)
int i=0;
char c; //接收输入的字符
printf("input a hex number:");
while((c=getchar())!='\0'){ // 一个一个字符
if(c>='0'&&c<='9'||c>='a'&&c<='f'||c>='A'&&c<='F'){
num[i++]=c;
}
else {
num[i]='\0';
printf("decimal number:%d\n",cov(num));
}
}
return 0;
}
int cov(char s[]){
int i,n=0;
for(i=0;s[i]!='\0';i++){
if(s[i]>='0'&&s[i]<='9')n=n*16+s[i]-'\0';
if(s[i]>='a'&&s[i]<='f')n=n*16+s[i]-'a'+10;
if(s[i]>='A'&&s[i]<='F')n=n*16+s[i]-'A'+10;
}
return n;
}
注意区分'\0'和'0',你应该减去'0'
if(s[i]>='0'&&s[i]<='9')n=n*16+s[i]-'0';
这段代码可以工作,但存在一些问题。
首先,在while循环中,当输入到字符串末尾时应该使用EOF而不是'\0'来检查输入结束。因为在输入时,除非你手动在输入中添加一个空字符'\0',否则它永远不会被键盘输入,所以while循环不会停止。可以将这一行代码修改为:
while((c=getchar())!=EOF){
其次,在函数cov()中的if语句中的计算公式不正确。应该使用s[i]-'0'而不是s[i]-'\0',因为字符'0'的ASCII码是48,而字符'\0'的ASCII码是0。所以,这一行代码应该修改为:
if(s[i]>='0'&&s[i]<='9')n=n*16+s[i]-'0';
最后,对于十六进制数的位数,需要在定义num数组的时候指定其大小,否则可能导致数组越界。可以将定义num数组的这一行代码修改为:
char num[MAX+1]; //输入的16进制数(字符),注意需要额外一个位置来存储'\0'字符
修改后的代码如下所示:
#include <stdio.h>
#define MAX 1000 //一个十六进制的最大位数
int cov(char s[]);
int main(){
char num[MAX+1]; //输入的16进制数(字符),注意需要额外一个位置来存储'\0'字符
int i=0;
char c; //接收输入的字符
printf("input a hex number:");
while((c=getchar())!=EOF){ //当输入到字符串末尾时,应该使用EOF而不是'\0'来检查输入结束
if(c>='0'&&c<='9'||c>='a'&&c<='f'||c>='A'&&c<='F'){
num[i++]=c;
}
else {
num[i]='\0';
printf("decimal number:%d\n",cov(num));
break; //加入break语句,结束while循环
}
}
return 0;
}
int cov(char s[]){
int i,n=0;
for(i=0;s[i]!='\0';i++){
if(s[i]>='0'&&s[i]<='9')n=n*16+s[i]-'0'; //修改if语句中的计算公式
if(s[i]>='a'&&s[i]<='f')n=n*16+s[i]-'a'+10;
if(s[i]>='A'&&s[i]<='F')n=n*16+s[i]-'A'+10;
}
return n;
}
不知道你这个问题是否已经解决, 如果还没有解决的话:在分析一道程序题时,让我对十六进制数如何存在于内存中以及结构体,共同体有了深刻的认识,但同时我又产生了一个新的疑惑,一直到写这篇博客的今天都无法理解。