@samsungovetch

C — Как посимвольно обработать строку, введённую с клавиатуры?

Даны символы s1,s2,... Известно, что символ s1 отличен от пробела и что среди s2,s3,... имеется хотя бы один пробел. Рассматриваются s1,...,sn - символы, предшествующие первому пробелу (n заранее неизвестно). Преобразовать последовательность s1,..., sn: удалив из каждой группы идущих подряд цифр, в которой более двух цифр и которой предшествует точка, все цифры, начиная с третьей (например, ab+0.1973-1.1 преобразуется в ab+0.19-1.1);

#include <string.h>     // strcat
#include <stdio.h>      // printf
#include <ctype.h>      // isdigit

//270Ã
char* get_string(char* str, int a);

int main()
{
    int l;
    char str[256];
    fgets(str, sizeof str, stdin);
    char* res = get_string(str, strlen(str));
    if (res)
    {
        printf("res=%s", res);
        free(res);
    }
    else
    {
        printf("Error. Spacebar can't be first digit.");
    }
    return 0;
}

char* get_string(char* str, int a)
{
    if (str[0] == ' ') //
    {
        return NULL;
    }

    int i = 0, count = 0, bool = 0;
    unsigned index = 0;
    char* result = malloc(a); //


    for (int i=0; i <= a; i++)
    {
        if (i!=0 && str[i] == ' ')
            break;
        else if (str[i] == '.')
            {
                bool = 1;
                result[index] = str[i];
                index += 1;
            }
        else if (isdigit(str[i]))
            {
                if (bool == 1)
                    {
                      count += 1;
                    if (count < 3)
                        {
                            result[index] = str[i];
                            index += 1;
                        }
                    }

                else
                    {
                        result[index] = str[i];
                        index += 1;
                    }
            }
        else
            {
                bool = 0;
                result[index] = str[i];
                index += 1;
            }

    }
    str[a] = '\0';
    return result;
}


Данный код выполняет следующее: строку ab+0.16516=0.123 превращает в ab+0.16=0. а должен в ab+0.16=0.12

Можно ли, не сильно меняя суть кода, подправить его?
  • Вопрос задан
  • 104 просмотра
Решения вопроса 1
saboteur_kiev
@saboteur_kiev
software engineer
Очень сложный код, куча лишних проверок.
Но на первый взгляд, вы count не обнуляете после обрезания первой цифры
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы