@Retr0Hacker

Как сделать проверку одних символов перед и после другого символа на Си?

С клавиатуры ввести символьную строку, в которой кроме слов могут быть целые
числа и вещественные числа, в которых дробная часть разделена запятой.
Извлечь из этой строки все числа. Печать сокращенной строки. Подсказка:
для удаления чисел нужно сдвигать все последующие слова налево.

Вот мой код:
#include <stdio.h>

int main(void) {

    char in[100];   //массив символів для вхідної строки
    char out[100];  //массив символів для вихідної строки

    int indexIN = 0,  //індекс массиву символів вхідної строки
        indexOUT = 0; //індекс массиву символів результуючої строки

    printf("Vvedit stroku:\n");

    gets_s(in);

    while (in[indexIN] != '\0')
    {
        if (in[indexIN] >= '0' && in[indexIN] <= '9')
            indexIN++;
        else
        {
            out[indexOUT] = in[indexIN];
            indexIN++;
            indexOUT++;
        }
    }

    out[indexOUT] = '\0';  //додаємо символ кінца строки в результуючий массив

    puts(out);

    return 0;
}


Я смог реализовать удаление целых чисел, но когда я пытаюсь удалить дробное число (например 4,5), удаляются только числа, а запятая остается

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

P.S. Если есть другие варианты кода для всей програмы, тоже буду очень признателен
  • Вопрос задан
  • 107 просмотров
Пригласить эксперта
Ответы на вопрос 2
includedlibrary
@includedlibrary
Просто смотрите на два символа вперёд, если они являются запятой и цифрой, то удаляйте их.
#include <stdio.h>
#include <stdbool.h>

static inline bool isDigit(char c) {
    return c >= '0' && c <= '9';
}

int main() {
    char in[100], out[100];
    int indexIN = 0, indexOUT = 0; 

    puts("Введите строку");
    fgets(in, 100, stdin);

    while(indexIN < sizeof(in) && in[indexIN]) {
        if (isDigit(in[indexIN])) {
            // Если два следующих символа - запятая и цифра
            if(indexIN < sizeof(in)-2 && in[indexIN+1] == ',' && isDigit(in[indexIN+2]))
                indexIN += 2;
            indexIN++;
        } else {
            out[indexOUT++] = in[indexIN++];
        }
    }

    out[indexOUT] = 0;
    puts(out);
}
Ответ написан
Комментировать
bingo347
@bingo347
Crazy on performance...
Я подумываю сделать проверку символов до и после запятой, но не знаю, как это сделать. Помоги мне, пожалуйста.
Проверяйте на число символы in[indexIN - 1] и in[indexIN + 1], при этом стоит учесть выход за границу при indexIN == 0.

Для начала можно вынести проверку на число в макрос, что бы не дублировать код:
#define IS_DIGIT(I) (in[(I)] >= '0' && in[(I)] <= '9')

Ну и само условие в if тогда будет выглядеть так:
if (IS_DIGIT(indexIN) || (in[indexIN] == ',' && indexIN != 0 && IS_DIGIT(indexIN - 1) && IS_DIGIT(indexIN + 1)))
    indexIN++;
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы