The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Индекс форумов
Составление сообщения

Исходное сообщение
"Выпуск языка программирования Rust 1.46"
Отправлено Ordu, 28-Авг-20 14:00 
Задумка этого кода в том, чтобы прочитать три инта из строчки? Инты разделены пробельными символами?

На, держи. Код совсем уж безбажен (как минимум там может быть переполнение unsigned в my_atoi), но навскидку это должно выглядеть так. Длинее чем у тебя, но зато читабельнее: проще понять и проще мейнтейнить

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>


static const char *skip_spaces(const char *p) {
    while(isspace(*p) && *p != '\0')
        p ++;
    return p;
}

static const char *skip_digits(const char *p) {
    while(isdigit(*p) && *p != '\0')
        p ++;
    return p;
}


// my_atoi: Преобразует первые len байт строки p в unsigned, и возвращает.
// NB: не проверяет корректность строки, это забота вызывающего кода
// Rationale: Библиотечные C'шные функции совершенно убоги, любят менять
// указатели, или хотят '\0' в конце, не умеют сообщать об ошибках,... У каждой
// свои косяки, нет ни одной пристойной. Проще самостоятельно проверить ввод и
// самостоятельно преобразовать.
static unsigned my_atoi(const char* p, size_t len) {
    unsigned ret = 0;
    for(size_t i = 0; i < len; i ++) {
        ret *= 10;
        ret += p[i] - '0';
    }
    return ret;
}
// get_vals: читает из buf три числа, разделённых пробельными символами, и
// пишет их в массив vars.
// Возвращает количество успешно прочитанных чисел.
int get_vals(const char *buf, unsigned var[3]) {
    const char *p = buf;
    if(buf == NULL) {
        fprintf(stderr, "KILL YOURSELF MOTHERFUCKER, BUF CANNOT BE NULL\n");
        exit(-1);
    }
    for(size_t i = 0; i < 3; i ++) {
        const char *start = skip_spaces(p);
        const char *end = skip_digits(start);
        if(start == end)
            return i;
        var[i] = my_atoi(start, end - start);
        p = end;
    }
    return 3;
}

int main() {
    unsigned arr[3];
    char* bufs[] = {
        "1 2 3", "    12\t398746 \n 2397\n\n",
        "12345", "1 2, -100"

    };
    for(size_t i = 0; i < sizeof(bufs)/sizeof(bufs[0]); i ++) {
        int ret = get_vals(bufs[i], arr);
        printf("ret: %d; vals: (%u, %u, %u)\n", ret, arr[0], arr[1], arr[2]);
    }
    return 0;
}

Вывод:

ret: 3; vals: (1, 2, 3)
ret: 3; vals: (12, 398746, 2397)
ret: 1; vals: (12345, 398746, 2397)
ret: 2; vals: (1, 2, 2397)

 

Ваше сообщение
Имя*:
EMail:
Для отправки ответов на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру