C语言中十六进制数到十进制数的转换
我正在做C编程语言书中的练习,练习2-3要求我们编写一个函数htoi,将十六进制数转换为十进制数 这是我写的代码,但是当它运行时,它总是显示我的十六进制数是非法的 请帮忙C语言中十六进制数到十进制数的转换,c,C,我正在做C编程语言书中的练习,练习2-3要求我们编写一个函数htoi,将十六进制数转换为十进制数 这是我写的代码,但是当它运行时,它总是显示我的十六进制数是非法的 请帮忙 #include<stdio.h> #define TRUE 1 #define FALSE 0 int htoi (char s[]); int main() { printf("The decimal number is %d\n", htoi("0x134")); retu
#include<stdio.h>
#define TRUE 1
#define FALSE 0
int htoi (char s[]);
int main() {
printf("The decimal number is %d\n", htoi("0x134"));
return 0;
}
int htoi (char s[]) {
int j; /* counter for the string */
int temp; /* temp number in between conversion */
int number; /* the converted number */
int ishex; /* if the number is a valid hexadecimal number */
char c;
number = 0;
temp = 0;
ishex = FALSE;
if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X')) {
ishex = TRUE;
}
else {
ishex = FALSE;
printf("This is not valid hexadecimal number.\n");
return number = 0;
}
if (ishex == TRUE) {
for (j = 2; (c = s[j]) != EOF; ++j) {
if (c >= '0' && c <= '9')
temp = c - '0';
else if (c >= 'a' && c <= 'f')
temp = 10 + c - 'a';
else if (c >= 'A' && c <= 'F')
temp = 10 + c - 'A';
else {
printf("This is a illegal hexadecimal number.\n");
ishex = FALSE;
return 0;
}
number = number * 16 + temp;
}
}
return number;
}
#包括
#定义真1
#定义FALSE 0
int htoi(字符s[]);
int main(){
printf(“十进制数为%d\n”,htoi(“0x134”);
返回0;
}
int htoi(字符s[]{
字符串的int j;/*计数器*/
int temp;/*转换之间的温度编号*/
整数;/*转换后的数字*/
int ishex;/*如果数字是有效的十六进制数字*/
字符c;
数字=0;
温度=0;
ishex=假;
如果(s[0]='0'&&(s[1]='x'| | s[1]='x')){
ishex=真;
}
否则{
ishex=假;
printf(“这不是有效的十六进制数。\n”);
返回编号=0;
}
如果(ishex==真){
对于(j=2;(c=s[j])!=EOF;++j){
如果(c>='0'&&c='a'&&c='a'&&c字符串是以第一个'\0'
字符终止的字符序列。这意味着“0x134”
以'\0'
字符值终止,而不是EOF
值
您正在操作一个字符序列,您希望该序列以EOF
值结尾,但这是不可能的。稍后我将解释为什么…现在只需说明,字符串“0x134”
不包含EOF
值
循环到达以'\0'
结尾的字符串,该字符串不在0..9
、a..f
或a..f
范围内,因此此分支执行:
else {
printf("This is a illegal hexadecimal number.\n");
ishex = FALSE;
return 0;
}
也许你想这样写你的循环:
for (j = 2; (c = s[j]) != '\0'; ++j) {
/* SNIP */
}
我答应解释期望EOF
作为字符值存在的错误。假设无符号字符
为8位,getchar
可以返回256个字符值中的一个,它将以正无符号字符
值的形式返回…或它可以返回负int
>值EOF
,对应于错误或文件结尾
困惑?在一个空文件中,没有字符…但是如果你试图从文件中读取一个字符,你每次都会得到EOF
,尽管没有字符。因此,EOF
不是字符值。它是int
值,在你试图将该值转换为cha之前应该这样处理莱克特,就像这样:
int c = getchar();
if (c == EOF) {
/* Here, c is NOT A CHARACTER VALUE! *
* It's more like an error code ... *
* XXX: Break or return or something */
}
else {
/* Here, c IS a character value, ... *
* so the following conversion is ok */
char ch = c;
}
另一方面,c>='0'&&c='a'&&c='a'&&c='0'&&c字符串是以第一个'\0'
字符结尾的字符序列。这意味着“0x134”
以'\0'
字符值结尾,而不是EOF
值
您正在操作一个字符序列,您希望该序列以EOF
值结尾,但这是不可能的。稍后我将解释为什么…现在只需说明,字符串“0x134”
不包含EOF
值
循环到达以'\0'
结尾的字符串,该字符串不在0..9
、a..f
或a..f
范围内,因此此分支执行:
else {
printf("This is a illegal hexadecimal number.\n");
ishex = FALSE;
return 0;
}
也许你想这样写你的循环:
for (j = 2; (c = s[j]) != '\0'; ++j) {
/* SNIP */
}
我答应解释期望EOF
作为字符值存在的错误。假设无符号字符
为8位,getchar
可以返回256个字符值中的一个,它将以正无符号字符
值的形式返回…或它可以返回负int
>值EOF
,对应于错误或文件结尾
困惑?在一个空文件中,没有字符…但是如果你试图从文件中读取一个字符,你每次都会得到EOF
,尽管没有字符。因此,EOF
不是字符值。它是int
值,在你试图将该值转换为cha之前应该这样处理莱克特,就像这样:
int c = getchar();
if (c == EOF) {
/* Here, c is NOT A CHARACTER VALUE! *
* It's more like an error code ... *
* XXX: Break or return or something */
}
else {
/* Here, c IS a character value, ... *
* so the following conversion is ok */
char ch = c;
}
另一方面,c>='0'&&c='a'&&c='a'&&c='0'&&c(c=s[j])!=EOF;
-->(c=s[j])!='\0';
EOF的定义是什么?EOF是一个整数,不能用字符表示。据我所知,它是用来完成带外信令的。EOF
用于表示文件的结尾。如果你在适当的标准头文件中查找它,我认为它的值恰好是-1
<0'
是一个空字符,用于终止字符串。它是一个值为0
的char
。两件完全不同的事情。我相信你的C语言书告诉过你。基本调试技巧:报告导致问题的值。例如:printf(“这是一个非法的十六进制数(%d='%C')。\n',C,C)
将在生成错误时告诉您正在分析的字符,这将使您更容易找出问题所在。我没有费心检查值是否可打印。有用的诊断帮助您-事实上,它们可能会让您不必再问这些问题。(c=s[j])!=EOF;
-->(c=s[j])!='\0';
EOF的定义是什么?EOF是一个整数,不能用字符表示。据我所知,它是用来完成带外信令的。EOF
用于表示文件的结尾。如果你在适当的标准头文件中查找它,我认为它的值恰好是-1
<0'
是一个空字符,用于终止字符串。它是一个值为0
的char
。两个完全不同的东西。我相信你的C语言书告诉你了。基本调试