Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
0 / 0 / 0
Регистрация: 08.10.2020
Сообщений: 26

atoi в C

09.10.2020, 15:27. Показов 4259. Ответов 9

Студворк — интернет-сервис помощи студентам
Помогите пожалуйста как выглядит функция создать функцию которая делает тоже что и atoi в C для этого кода
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
 
int main()
{
    long long x = 0;
    long y = 11;
    long long i = 0;
    long long ans = 0;
    long long a[11];
    printf("Input number x: ");
    char str[50] = "";
    fgets(str, 50, stdin);// scanf(" %lli", &x); getchar();
    for (int i = 0; str[i] != '\n'; i++)
        if (str[i] < '0' || str[i]>'9') return 1;
    x = atoi(str);
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.10.2020, 15:27
Ответы с готовыми решениями:

atoi
Как с помощью atoi получить число не из всей строки, а из ее элемента? Например строка : 1234. Число хочу получить 23. Как это реализовать?

atoi в uintmax_t
Это возможно? Мне нужно из командной строки &quot;сохранить&quot; очень большое целое число. Можно ли это сделать с помощью atoi. Или нужно что-то...

Не работает atoi()
Использую VS 2015 в switch при вводе другой буквы должен сработать default и atoi должен записать значение в val но выводится 0 ,или это я...

9
 Аватар для Annemesski
2681 / 1341 / 482
Регистрация: 08.11.2016
Сообщений: 3,707
09.10.2020, 15:41
C
1
2
3
4
5
6
7
8
9
10
11
12
13
int myAtoi(const char *s)
{
    int sign = s[0] == '-', ret = 0;
    for (int i = sign; str[i]; ++i)
    {
        if (str[i] < '0' || str[i] > '9')
            return INT_MIN;
        ret *= 10;
        ret += str[i] - '0';
    }
 
    return (sign ? -ret : ret);
}
0
0 / 0 / 0
Регистрация: 08.10.2020
Сообщений: 26
09.10.2020, 15:48  [ТС]
Не совсем понимаю куда это вставлять в мой код плюс выдаёт ошибки с массивом s[0]
0
 Аватар для scanf
96 / 69 / 27
Регистрация: 26.08.2020
Сообщений: 360
09.10.2020, 15:54
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
int atoi(const char* str){
    int x;
    for (int i=0;str[i]!='\0';i++){
        if (!(str[i]>=48 && str[i]<=57)) return 0;
    }
    sscanf(str,"%d",&x);
    return x;
}
int main(void){
    const char* str="465";
    int x=atoi(str);
    x+=35;
    printf("%d",x);return 0;
1
 Аватар для Annemesski
2681 / 1341 / 482
Регистрация: 08.11.2016
Сообщений: 3,707
09.10.2020, 16:16
HiL_Madara, вставьте мой код перед Вашей функцией int main() и замените у себя строку #16 x = atoi(str); на x = myAtoi(str); после чего добавьте printf("%d\n", x);
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13202 / 6837 / 1822
Регистрация: 18.10.2014
Сообщений: 17,296
09.10.2020, 18:00
Цитата Сообщение от Annemesski Посмотреть сообщение
C
1
2
        if (str[i] < '0' || str[i] > '9')
            return INT_MIN;
Какое это имеет отношение к atoi? atoi обязана просто прекращать преобразование и возвращать накопленный результат при встрече неправильного символа, а не возвращать некий INT_MIN.

Цитата Сообщение от scanf Посмотреть сообщение
if (!(str[i]>=48 && str[i]<=57)) return 0;
Так же самая ошибка, только с дикими магическими константами.

Не понимаю, зачем было вообще что-то городить, если вы все равно затем воспользовалиь sscanf, а поведение sscanf почти точно воспоризводит atoi.

И не понятно, зачем тогда было использовать sscanf, если сразу можно было воспользоваться strtol и получить именно то, как реализуется atoi практически во всех стандартных библиотеках.
0
 Аватар для analogov net
2532 / 1130 / 494
Регистрация: 17.11.2018
Сообщений: 2,836
09.10.2020, 19:04
Лучший ответ Сообщение было отмечено HiL_Madara как решение

Решение

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
int MyAtoi( char *str )
{
    int sign = 1, result = 0;
 
    if( *str == '-' )
        sign = -1,  str++;
    
    for( ; *str >= '0' && *str <= '9' && *str; str++ )
        result = result * 10 + *str - '0';
 
    return result * sign;
}
 
int main()
{
    char string1[] = "12345";
    char string2[] = "54321!qwerty!12345";
    char string3[] = "-987.654";
 
    int num1a = atoi( string1 );
    int num2a = atoi( string2 );
    int num3a = atoi( string3 );
    int num1  = MyAtoi( string1 );
    int num2  = MyAtoi( string2 );
    int num3  = MyAtoi( string3 );
 
    printf( "String1=%-20s atoi=%-7d MyAtoi=%-7d\n", string1, num1a, num1 );
    printf( "String2=%-20s atoi=%-7d MyAtoi=%-7d\n", string2, num2a, num2 );
    printf( "String3=%-20s atoi=%-7d MyAtoi=%-7d\n", string3, num3a, num3 );
 
    return 0;
}
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13202 / 6837 / 1822
Регистрация: 18.10.2014
Сообщений: 17,296
09.10.2020, 20:37
Цитата Сообщение от analogov net Посмотреть сообщение
C
1
for( ; *str >= '0' && *str <= '9' && *str; str++ )
Избыточное условие. Из того, что очередной символ - цифра, автоматически следует, что он - не нулевой терминатор.

И, разумеется, параметр должно иметь тип const char *

Также atoi допускает, что запись числа может начинаться с +.

Добавлено через 12 минут
Цитата Сообщение от HiL_Madara Посмотреть сообщение
Помогите пожалуйста как выглядит функция создать функцию которая делает тоже что и atoi в C для этого кода
Если речь идёт об atoi, то почему ваши переменные вдруг имеют тип long long? К чему он тут?
1
0 / 0 / 0
Регистрация: 08.10.2020
Сообщений: 26
09.10.2020, 21:41  [ТС]
Не могли бы вы расписать как можно было бы эту функцию в библиотеке stdio.h представить

Добавлено через 44 минуты
atoi нужна мне для проверки строк на запятые и буквы сама же программа высчитывает формулу
0
 Аватар для New_user_2020
45 / 32 / 14
Регистрация: 26.05.2020
Сообщений: 89
11.10.2020, 10:21
C
1
2
3
4
5
6
7
8
9
10
11
12
int char_to_int(char* str)
{
    int number = 0;
    if (*str == '-' || *str == '+')
        str++;
    while (*str >= '0' && *str <= '9') {
        number *= 10;
        number += *str++;
        number -= '0';
    }
    return number;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.10.2020, 10:21
Помогаю со студенческими работами здесь

Использование функции atoi()
элемент кода в котором проводится выбор дальнейшего действия.Нужно что-бы при выборе буквы выводилось сообщение &quot;not letter&quot;.Для...

Работа atoi и itoa
По заданию есть две строчки в которых только цифры, длинна строчек более 10 символов. При длине строчки &lt;=9 (выходит цифра 9-го...

Выделение чисел из строки через atoi()
Есть вот такая строка &quot;FUNCTION(y=7+9*x)&quot;, задаю её я через argv и мне надо выделить из неё числа и записать их в переменные. Помогите,...

Длинная арифметика - почему и зачем здесь atoi?
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;stdio.h&gt; #include &lt;string.h&gt; using namespace std; const int N=10000; int d; ...

Функция atoi и символьный массив
Есть символьный массив и массив целых чисел. Необходимо преобразовать символьный в целый тип. #include &lt;stdio.h&gt; #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru