возвращаемая строка отличается от строки в функции в c - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь преобразовать десятичное число в его шестнадцатеричное представление (и хочу получить только четвертые цифры LSB). Кажется, что моя функция работает, но когда я пытаюсь получить значение числа из основной функции, я получаю все цифры и x1!=x2. Где я не прав?

вот мой код:

char* dec_to_hex_converter(int num, char x[])
{
int i = 1;
int size = 0;

sprintf(x, "%04X\n", num);
size = strlen(x);
if (size > 4)
{
    while (size > 4)
    {
        x++;
        size--;
    }
    x--;
}
*(x + 4) = '\0';
printf("x1=%s\n", x);
return x;
}

int main()
{
    char x[10];
    dec_to_hex_converter(-16,x);
    printf("x2=%s\n", x);
}

Я хочу получить FFF0 но когда я печатаю результат, я получаю FFFFFFF0 (ТОЛЬКО ВНЕ ФУНКЦИИ)

заранее спасибо

Ответы [ 3 ]

0 голосов
/ 02 мая 2018

Когда вы изменяете x в функции, вы изменяете только локальный указатель, который был инициализирован массивом x из main.

Фактически объявление функции рассматривается компилятором как:

char* dec_to_hex_converter(int num, char *x)

Чтобы действительно понять это, вы можете контролировать возвращаемое значение:

int main()
{
    char x[10];
    char *cur = dec_to_hex_converter(-16,x);
    printf("x2=%s (returned:%s\n", x, cur);
    printf("delta %d\n", cur - x);
    return 0;
}

Вывод будет:

x1=FFF0
x2=FFFFFFF0 (returned:FFF0)
delta 4
0 голосов
/ 02 мая 2018

Вы, кажется, смешиваете некоторые понятия. В названии вы упоминаете строку, возвращаемую функцией.

Если вы хотите вернуть строку, вы можете использовать ее следующим образом:

int main()
{
    char x[10];
    char *result = dec_to_hex_converter(-16,x);
    printf("x2=%s\n", result);
}

В вашем коде вы пытаетесь изменить переданный указатель. Это потребовало бы передачи «ссылки» на него вместо самого указателя. (В C нет реальных ссылок. Вместо этого вам нужно передать указатель на указатель)

И самое главное, вам нужно передать изменяемое lvalue в функцию. Адрес массива не подлежит изменению.

0 голосов
/ 02 мая 2018

Указатель x, который печатается внутри dex_to_hex_converter(), перемещен в середину массива символов. Так что печатается только половина строки.

char [] = "FFFFFFF0\0"
               ^
               |
               x

Когда вы возвращаетесь к main(), указатель x, который был передан по значению, возвращается к своему первоначальному значению, указывающему на начало массива символов, и, таким образом, вся строка снова выводится на печать.

char [] = "FFFFFFF0\0"
           ^
           |
           x

Чтобы получить доступ только к той части строки, которую вы хотите ... используйте возвращенный указатель, а не тот, который был передан:

printf("ret=%s\n", dec_to_hex_converter(-16, x));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...