Возникли проблемы с указателями.Преобразование шестнадцатеричного в десятичное int в C - PullRequest
1 голос
/ 07 февраля 2012

У меня уже есть код, но он не работает, так как я подозреваю, что испортил мои указатели.

Задача состоит в преобразовании заданного десятичного числа в шестнадцатеричное.И мы должны делать это вручную, поэтому я не могу использовать printf для его печати или использовать strtol или что-то еще.

Вот мой код:

Ответы [ 4 ]

1 голос
/ 07 февраля 2012

Добавление к тому, что сказал nmicheals. Последние 3 строки вашей функции выглядят так, как будто они принадлежат последнему циклу while. В противном случае вы изменяете их значения только один раз для последней цифры.

1 голос
/ 07 февраля 2012

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, так что цикл после негоникогда не будет введен.

0 голосов
/ 07 февраля 2012

Ваш код работает в неправильном направлении. Строка "2ef" анализируется справа налево. Но значение ptr находится в значении '\ 0' при окончании строки и никогда не проходит через цикл while. Также ptr должен быть уменьшен, а базовый увеличен. Я установил для базы значение 0 при обработке цифры 1.

#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;
}
0 голосов
/ 07 февраля 2012

Этот цикл гарантирует, что ваш цикл синтаксического анализа никогда не запустится.

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

Вам нужно сбросить указатель после этого цикла, чтобы запустить следующий цикл.

ptr=string;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...