指针有一些问题。在C中将十六进制转换为十进制int

时间:2012-02-07 17:55:36

标签: c pointers

我已经有了代码但由于我怀疑我搞砸了我的指针而无法正常工作。

该问题应该将给定的十进制转换为十六进制。我们应该手动完成它,这就是为什么我不能使用printf打印它或使用strtol或其他什么。

这是我的代码:

4 个答案:

答案 0 :(得分:1)

如果您尝试取消引用指针,

while (&ptr != '\0')应为while (*ptr != '\0')

此外,

while (*ptr != '\0') {
        ptr++; 
        base++;
}
// ptr points to the end of the string now. The condition in the next line can't be true.
while (*ptr != '\0') {
    switch (*ptr) {
        case '0': 
            replaceInt = 0;
...

第一个循环将使ptr前进,以便永远不会输入它之后的循环。

答案 1 :(得分:1)

添加到nmicheals所说的内容。 你函数的最后3行似乎属于最后一个while循环。否则,您只需为最后一位数更改一次值。

答案 2 :(得分:0)

这个循环保证你的解析循环永远不会运行。

  while (&ptr != '\0') { // As noted by the other poster you want *ptr instead of &ptr
        ptr++; 
        base++;
    }

您需要在此循环后重置指针,以便下一个循环运行。

ptr=string;

答案 3 :(得分:0)

您的代码运行方向错误。字符串“2ef”从右到左解析。但是当对字符串进行罚款并且从不运行while循环时,ptr的值位于'\ 0'值。 ptr也需要递减和基数增加。我在处理1位数时将base设置为0。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <math.h>

int convertHexToDec(char *string);

/* Runs the main program and asks for user input */
int main(int argc, char* argv[]) {
    char* programName;
    programName = argv[0];

    /* Prints an error if user's input is less than 1 argument. */
    if(argc <= 1) {
        printf("Error: Not enough arguments.\n");
    }

    if (argc >= 2) {
        int i;
        for (i = 1; i <= argc - 1; ++i) {
            printf("%s = %d\n", argv[i], convertHexToDec(argv[i]));
        }

    }
    return 0;
}

int convertHexToDec(char* string) {
    char *ptr;
    ptr = string;
    int decimalNum = 0, base = 0, replaceInt = 0;

    while (*ptr != '\0') {
        ptr++;
    }
    ptr--;

    while (*ptr != '\0') {
        switch (*ptr) {
            case '0':
                replaceInt = 0;
                break;
            case '1':
                replaceInt = 1;
                break;
            case '2':
                replaceInt = 2;
                break;
            case '3':
                replaceInt = 3;
                break;
            case '4':
                replaceInt = 4;
                break;
            case '5':
                replaceInt = 5;
                break;
            case '6':
                replaceInt = 6;
                break;
            case '7':
                replaceInt = 7;
                break;
            case '8':
                replaceInt = 8;
                break;
            case '9':
                replaceInt = 9;
                break;
            case 'a':
                replaceInt = 10;
                break;
            case 'b':
                replaceInt = 11;
                break;
            case 'c':
                replaceInt = 12;
                break;
            case 'd':
                replaceInt = 13;
                break;
            case 'e':
                replaceInt = 14;
                break;
            case 'f':
                replaceInt = 15;
                break;
            default:
                printf("Wrong input");
                exit(0);
        }
        decimalNum += pow(16, base) * replaceInt;
        ptr--;
        base++;
    }

    return decimalNum;
}