Перевод char в int работает только для положительных, не дробных чисел - C (СИ)

Узнай цену своей работы

Формулировка задачи:

{
    int i, Chislo=0;
    if(!StrLen(str))
        return 0;
    for(i=0;i<StrLen(str);i++)
        Chislo=Chislo*10+(str[i]-'0');
    return Chislo;
}
Это работает только для положительных, не дробных чисел, притом работает только с ограниченным числом. Например, если ввести 12345678901, то выдает непонятное отрицательное число. Получается так, как только вводится более, чем 10 элементов, то переводится ненормально. Можно ли сделать, чтобы переводил и отрицательные числа (например, -1234)? Можно ли переводить дробные (например, 123,456)? И почему работает только с ограниченным числом? Вообще int вроде 32767. Заранее спасибо.
С отрицательными разобрался.

Решение задачи: «Перевод char в int работает только для положительных, не дробных чисел»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
 
long long convert(char *str) {
    long long i, Chislo = 0, minus = 0, count = 0;
    if (!strlen(str))
        return 0;
    for (i = 0; i < strlen(str); i++) {
        if (str[i] == ' ') {
            count++;
            continue;
        }
        if (!minus)
            if (str[count] == '-') {
                minus++;
                continue;
            }
        if (str[i] < '0' || str[i] > '9')
            return 0;
        Chislo = Chislo * 10 + (str[i] - '0');
    }
    if (minus)
        return -Chislo;
    return Chislo;
}
 
int main() {
    char str[]="1234567890123";
    long long x;
    x=convert(str);
    printf ("%Ld\n", x);
    printf("%lu\n%Ld\n%Lu ", sizeof(long long), LLONG_MAX, ULLONG_MAX);
    return 0;
}

Объяснение кода листинга программы

  1. long long i, Chislo = 0, minus = 0, count = 0; - Здесь объявляются четыре переменные типа long long: i, Chislo, minus и count. Значения переменных инициализируются нулями.
  2. if (!strlen(str)) - Если длина строки равна нулю, то выполняется код в блоке if и возвращается 0. Это предусмотрено для случая, когда в функцию convert передается пустая строка.
  3. for (i = 0; i < strlen(str); i++) - Здесь начинается цикл for, который будет выполняться столько раз, сколько символов в строке.
  4. if (str[i] == ' ') - Если текущий символ равен пробелу, то переменная count увеличивается на единицу и выполняется переход к следующему циклу.
  5. if (!minus) - Если переменная minus равна нулю, то проверяется, является ли текущий символ минусом. Если это так, то переменная minus увеличивается на единицу и выполняется переход к следующему циклу.
  6. if (str[i] < '0' || str[i] > '9') - Если текущий символ меньше '0' или больше '9', то функция convert возвращает 0, так как это не цифра.
  7. *Chislo = Chislo 10 + (str[i] - '0');** - Если текущий символ является цифрой, то он переводится в целое число и добавляется к переменной Chislo.
  8. if (minus) - Если переменная minus больше нуля, то значение переменной Chislo инвертируется, т.е. меняет знак на противоположный.
  9. return Chislo; - В конце функции convert возвращается значение переменной Chislo.
  10. char str[]=1234567890123; - В функции main объявляется строковая переменная str и инициализируется строкой 1234567890123.
  11. long long x; - Объявляется переменная x типа long long.
  12. x=convert(str); - Функция convert вызывается с аргументом str и результат присваивается переменной x.
  13. printf (%Ld\n, x); - Выводится значение переменной x.
  14. printf(%lu\n%Ld\n%Lu, sizeof(long long), LLONG_MAX, ULLONG_MAX); - Выводятся размеры типа long long и максимальные значения для этого типа.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.8 из 5
Похожие ответы