繁体   English   中英

C语言中的Hex / Dec程序输出错误,无法使用Scanf

[英]Hex/Dec Program in C getting the wrong output and cant use Scanf

每当我运行程序时,我都认为使用包含的测试字符串会得到错误的输出,尽管我认为我的第一个功能正在运行。 我拥有的文件是xbits.c xbits.h和showxbits.c的两个版本,一个是教师提供的版本,另一个是我试图与scanf一起使用的版本。 该程序应该将整数转换为十六进制字符串,然后将十六进制字符串转换为整数。 我的主要问题是,尽管我认为我的代码可用于讲师的测试输入,但我知道它不适用于scanf showxbits,因为当输入127时,它会给出诸如0xS的答案。

这是xbits.c

#include <stdio.h>
#include <math.h>

int hex_To_dec(int c) {
        char hex_values[] = "aAbBcCdDeEfF";
        int i;
        int answer = 0;
        for (i=0; answer == 0 && hex_values[i] != '\0'; i++) {
                if (hex_values[i] == c) {
                answer = 10 + (i/2);
                }
        }
        return answer;
}
/* function represents the int n as a hexstring which it places in the
hexstring array */
void itox(char* s, int n)
{
        char *digits = "0123456789ABCDEF";
        int i=0,j;
        char temp;
        while(n > 0)
        {
                s[i] = digits[n % 16]; 
                n /= 16;
                i++;
        }
        s[i] = '\0'; // Add null terminator
        i--;
        // Now reverse it in place
        for(j=0; j < i / 2; j++)
        {
                temp = s[j];
                s[j] = s[i - j];
                s[i - j] = temp;
        }
}
/* function converts hexstring array to equivalent integer value  */
int xtoi(char hexstring[]) {
        //printf("in xtoi, processing %s\n", hexstring);
        int answer = 0;
        int i = 0;
        int valid = 1;
        int hexit;
        if (hexstring[i] == '0') {
                ++i;
                if (hexstring[i] == 'x' || hexstring[i] == 'X') {
                        ++i;
                }
        }
        while(valid && hexstring[i] != '\0') {
                answer = answer * 16;
                if(hexstring[i] >='0' && hexstring[i] <= '9') {
                        answer = answer + (hexstring[i] - '0');
                }
                else {
                        hexit = hex_To_dec(hexstring[i]);
                        if (hexit == 0) {
                                valid = 0;
                        }
                        else {
                        answer = answer + hexit;
                        }
                }
                ++i;
        }
        if(!valid) {
                answer = 0;
        }
        return answer;
}

这是讲师提供的showxbits.c:

/*
 *  stub driver for functions to study integer-hex conversions
 *
 */

#include <stdio.h>
#include <string.h>
#include "xbits.h"

#define ENOUGH_SPACE 1000 /* not really enough space */

int main() {
  char hexstring[ENOUGH_SPACE];
  int m=0, n = 0x79FEB220;
  itox(hexstring, n);


  /* for stub testing: create a fake input string */
  strcpy(hexstring, "6BCD7890"); 
  m = xtoi(hexstring);

  printf("\t%12d %s %12d\n", n, hexstring, m);

  return 0;  /* everything is just fine */
}

这是其中包含scanf的showxbits:

/*
 *  stub driver for functions to study integer-hex conversions
 *
 */

#include <stdio.h>
#include <string.h>
#include "xbits.h"

#define ENOUGH_SPACE 100 /* not really enough space */

int main() {
    char hexstring[ENOUGH_SPACE];
    //int m=0, n = 0x79FEB220;
    int n, m;
    while ((scanf("%d", &n)) == 1) {
        itox(hexstring, n);
        m = xtoi( hexstring);
        printf("%12d  %s  %12d\n", n, hexstring, m);
    }

return 0;  /* everything is just fine */
}

就像我说的那样,使用scanf函数时我得到了奇怪的输出。 我是一个完整的初学者程序员,非常感谢可以提供的任何帮助。 谢谢!

因为函数itox存在错误,所以在反向字符串时会导致错误的结果。 然后,来自itox的错误十六进制itox将导致异常输出。

快速解决方案是将j < i / 2替换为j < i / 2 + 1

void itox(char* s, int n)
{
        //......
        // Now reverse it in place
        for(j=0; j < i / 2 + 1 ; j++)
        {
                temp = s[j];
                s[j] = s[i - j];
                s[i - j] = temp;
        }
}

您无需反转字符串即可转换为十六进制ASCII:

#include <stdio.h>

const char* hexlat="0123456789ABCDEF";

char *binaryToHex(unsigned int answer, char *result){
  if(answer==0) return result;
  else{
     result=binaryToHex(answer>>4,result);
    *result=hexlat[answer & 0x0F];
    return result+1;
  }
};

int main(void) {
    unsigned int answer=0x12340ADF;
    char hexAnswer[32];
    *binaryToHex(answer,hexAnswer)='\0';
    printf("%s",hexAnswer);
    return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM