Функция, возвращающая значение типа Я не хочу его возвращать - PullRequest
1 голос
/ 21 сентября 2011

Для проблемы в школе мне нужно преобразовать ASCII-строку из цифр символов в десятичное значение. Я написал для этого функцию и указал тип возвращаемого значения unsigned short , как вы можете видеть в приведенном ниже коде.

#include <stdio.h>
unsigned short str_2_dec(char* input_string, int numel);
int main()
{
  short input;
  char input_string[6]= "65535";

  input = str_2_dec(input_string, 5);

  printf("Final Value: %d", input);
  return 0;
}
unsigned short str_2_dec(char* input_string, int numel)
{
  int factor = 1;
  unsigned short value = 0;
  int index;

  for(index=0; index <(numel-1); index++)
  {
    factor *= 10;
  }

  for(index = numel; index > 0; index--)
  {
    printf("Digit: %d; Factor: %d; ", *(input_string+(numel-index))-48, factor);
    value += factor * ((*(input_string+(numel - index))-48));

    printf("value: %d\n\n", value);

    factor /= 10;
  }
  return value;
}

При запуске этого кода программа выводит -1 в качестве конечного значения вместо 65535. Похоже, он отображает соответствующее значение со знаком в любом случае. Кажется, что-то очень простое, но я не могу найти ответ. Ответ будет принята с благодарностью.

Ответы [ 6 ]

3 голосов
/ 21 сентября 2011

Тип возврата для str_2_dec(): unsigned short, но вы сохраняете значение в (*) переменной * (подпись). Вы должны объявить ваши переменные соответствующим типом, иначе у вас будут проблемы, как вы заметили.

В этом случае вы преобразовали "65535" в unsigned short с битовой комбинацией FFFF Hex . Этот битовый образец был переосмыслен как (подписанный) short, который является десятичным значением -1.

Вы должны изменить свой main() на что-то вроде этого:

int main()
{
    unsigned short input; /* to match the type the function is returning */
    char input_string[6]= "65535";

    input = str_2_dec(input_string, 5);

    printf("Final Value: %hf", input);
    return 0;
}
2 голосов
/ 21 сентября 2011

Проблема в том, что вы берете unsigned short возвращаемое значение функции и сохраняете его в (подписанной) переменной short, input. Поскольку значение находится за пределами диапазона, представленного в short, и поскольку short подписано, это приводит либо к результату, определяемому реализацией, либо к сигналу, определяемому реализацией.

Измените тип input на unsigned short и все будет хорошо.

1 голос
/ 21 сентября 2011

Вы имеете в виду, что индекс печати здесь был (signed) short?

short input;
...
printf("Final Value: %d", input);

Обновление: Поскольку подсказка, похоже, не уловила, я буду более прямолинейным: ваше заявление о вводе должно быть unsigned short input;.

0 голосов
/ 21 сентября 2011

Вы не использовали правильный спецификатор формата для

short input;
printf("final value=%d\n",input);

Это отличает ваш аут.

0 голосов
/ 21 сентября 2011

Проблема не в функции, а в том, как вы печатаете возвращаемое значение.

printf("Final Value: %d", input);

%d является заполнителем для типа int, а не короткого.

Вместо этого используйте %hu.

0 голосов
/ 21 сентября 2011

Вы используете неправильный спецификатор формата в printf.попробуйте использовать %u вместо %d

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