Создание функции Atoi в C - PullRequest
0 голосов
/ 02 декабря 2018

Я пытаюсь создать функцию atoi и думаю, что сделал правильный код, но когда я его запускаю, он показывает неправильный код.Я пытаюсь понять это, но не знаю, что я сделал неправильно, пожалуйста, проверьте код и помогите

Мой код

#include <stdio.h>

int my_atoi(char *str)
{
  int i;
  int res;
  int sign;

  i = 0;
  res = 0;
  sign = 1;//sign of '-' or '+'
  while(str[i] == ' ' || (str[i] >= 9 && str[i] <= 13))
  {
    i++;
  }
  if(str[i] == '-')
  {
    sign = -1;
    i++;
  }
  else if(str[i] == '+')
  {
    sign = 1;
    i++;
  }
  while(str[i] >= '0' && str[i] <= '9')
  {
    res = res * 10 + str[i] + '0';
    i++;
  }
  return(res * sign);// to make integer which has value of '-' or '+'
}

int main(void)
{
  char str[] = "-2018shiba";
  printf("%d\n", my_atoi(str));
  return(0);
}

Когда я запускаю его,показывает -108674

1 Ответ

0 голосов
/ 02 декабря 2018

Я вижу здесь несколько ошибок.

  1. Если вы хотите преобразовать символ ASCII в соответствующее целое число, вам нужно вычесть '0'.Посмотрите на таблицу ASCII: например, «7» отображается с десятичным значением 55. Следовательно, если вы хотите получить 7, вам нужно вычесть ASCII из «0», что равно 48 (55 - 48 = 7):
int foo = str[i] - '0';

В самом последнем цикле while my_atoi .Значение индексированного числового представления строки рассчитывается путем умножения значения str [i] с числовым значением base на степень индекса , начиная с .
Например, давайте посмотрим на «1337»:

7*10^0 + 3*10^1 + 3*10^2 + 1*10^3 = 7 + 30 + 300 + 1000 = 1337

Как видите, 7 имеет числовой индекс 0 и так далее.Предполагая, что вы хотите просто игнорировать шиба ваш код будет выглядеть что-то , например:

#include <stdio.h>
#include <string.h>

// Return base^(exponent)
int my_pow(int base, unsigned int exponent)
{
  if (exponent == 0) {
    return 1;
  } else {
    int result = base;
    for (int i = 1; i < exponent; i++) {
      result *= base;
    }
    return result;
  }
}

int my_atoi(char *str, size_t len)
{
  int i;
  int res;
  int sign;

  i = 0;
  res = 0;
  sign = 1;//sign of '-' or '+'
  while(str[i] == ' ' || (str[i] >= 9 && str[i] <= 13))
  {
    i++;
  }
  if(str[i] == '-')
  {
    sign = -1;
    i++;
  }
  else if(str[i] == '+')
  {
    sign = 1;
    i++;
  }

  // Store the index where the number string starts
  int j = i-1;
  // Find the ending index of the number string
  i = len;
  while (str[i] < '0' || str[i] > '9') {
      i--;
  }
  int num_end = i;

  // Now start at the ending
  while(i > j)
  {
    if (str[i] >= '0' && str[i] <= '9') {
      res += my_pow(10, num_end-i) * (str[i] - '0');
    } else {
      // If a character unequal to a digit is found then skip it
      num_end--;
    }

    i--;
  }
  return(res * sign);// to make integer which has value of '-' or '+'
}

int main(void)
{
  char str[] = "-2018shiba";
  printf("%d\n", my_atoi(str, strlen(str)));
  char str2[] = "-20X18shiba";
  printf("%d\n", my_atoi(str2, strlen(str2)));
  return(0);
}
...