Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中十六进制数到十进制数的转换_C - Fatal编程技术网

C语言中十六进制数到十进制数的转换

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

我正在做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"));
      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语言书告诉你了。基本调试