簡體   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