Как удалять характер, повторенный в C?

Я наполняю формуляр с утверждениями и есть поле, которое просит у меня среднюю величину, и одно из правил, чтобы это санкционировать, состоит в том, чтобы он только содержал десятичную точку.

Пример:

Если пользователь набивает 2. 2, которые вновь бы спрашивали среднюю величину.

У кого-то идея есть как делать это? Спасибо.: D

У меня есть этот код, но он удаляет все мне повторенные, я одинокий хочу, чтобы я удалил точку '.'

#include <stdio.h> 
#include <string.h>  
int main() 
{ 
    char resultado[27]=""; 
    char palabra[50];
    int i=0,j=0; 
    printf("Ingresa una frase!\n");scanf("%s",palabra); 
    while(palabra[i]) 
    { 
        if(!strchr(resultado,palabra[i])) 
            resultado[j++]=palabra[i]; 
        i++; 
    } 
    resultado[j]='\0'; 
    printf("\nEl resultado seria!\n%s",resultado); 

    getchar(); 
    return(0);
}
5
задан 12.04.2016, 21:57
2 ответа

Решение Альваро Монторо funcona; однако это решение очень ; ввиду того, что ты также приклеил этикетку на вопрос, как я предлагаю тебе использовать книжный магазин <regex>(как уже предложил Альваро), что позволяет делать операции в небольшом количестве линий:

bool punto_repetido(const std::string &entrada)
{
    std::regex puntos{R"(\d*\.{2,}\d*)"};
    return std::regex_match(entrada, puntos);
}

Функция punto_repetido он покажет, набил ли пользователь число с двумя точками вместо одного; ты можешь исправлять ввод с этой другой функцией:

std::string corrige(const std::string &entrada)
{
    std::regex puntos{R"(\.{2,})"};
    return std::regex_replace(entrada, puntos, ".");
}

Ты можешь видеть код в функционировании здесь.

Имей в виду, что он только оценивает поступающие данные, которые были бы похожи на число (он не оценит 2.2.2, ни aaadfa...a например).

3
ответ дан 24.11.2019, 14:36
  • 1
    Ты разорил меня, я сделал доказательства как проект C и не в C ++: P – Alvaro Montoro♦ 13.04.2016, 14:42
  • 2
    У него нет ничего из дьявола, который c и # 243; я говорю, что его было c ; однако автор вопроса быть должным и # 225; выбирать язык или другой так как из-за многого, который в каких-то c и # 237; rculos настояли, что - то же самое , несомненно это очень различные языки, хотя Ваши парадигмы будут почти равны. – PaperBirdMaster 13.04.2016, 14:43
  • 3
    Говорить, что C и C ++ - то же самое, - бесчеловечность. Я предполагаю, что dir и # 225; n, потому что c и # 243; я говорю, что C оно обычно функционирует в составителях C ++, но это быть и # 237; в как сравнивать Сеат Панда с Ferrari и говорить, что они - то же самое, потому что два - машины, и рычаг переключения скоростей продолжает ту же структуру. – Alvaro Montoro♦ 13.04.2016, 14:50

Код, который ты имеешь, удаляет все символы, повторенные в цепи, но только ты хочешь удалить какие-то символы (точки), который был после первой точки.

Для этого ты мог бы продолжать следующий алгоритм:

  1. Пересеки начитанную цепь
  2. Если символ не точка
    1. Скопируй символ в результате
  3. Если символ - точка
    1. Если это первая точка, которая находится
      1. Скопируй точку в результате

Код был бы таким:

#include <stdio.h> 
#include <string.h>

int main() 
{ 
    char resultado[27]=""; 
    char palabra[50];
    int i=0,j=0; 
    int punto = 0; // variable centinela para comprobar el número de puntos

    printf("Ingresa una frase!\n");
    scanf("%s",palabra);

    // atraviesa la palabra leida
    for (i = 0; i < strlen(palabra); i++) {
        // si la palabra es un punto
        if (palabra[i] == '.') {
            // y es el primer punto que se encuentra
            if (punto == 0) {
                // activa el centinela y añade el punto al resultado
                punto = 1;
                resultado[j++] = '.';
            }
        // si no es un punto, añade el carácter/número al resultado
        } else {
            resultado[j++] = palabra[i];
        }
    }

    resultado[j] = '\0';

    printf("\nEl resultado seria!\n%s",resultado); 

    getchar(); 
    return(0);
}

Немного различная альтернатива, и которая похожа больше на код, который ты показал:

  1. Инициализируй переменные i и j в 0.
  2. Инициализируй переменную resultado в "".
  3. Используй strchr чтобы находить первую точку в начитанной цепи
  4. Если находилась точка
    1. Обнови стоимость i в положение точки в цепи
    2. Обнови стоимость resultado в субцепь до точки (ты можешь использовать memcpy для этого)
    3. Обнови стоимость j в длину resultado
  5. Пересеки цепь, прочитанную с положения i.
    1. Если символ не точка, добавь это в результате

Если ты обращаешь внимание шаги, 1, 2 и 5 почти равны тому, что уже у тебя есть, и только ты был бы должен добавлять шаги 3 и 4, который - это, чтобы обновлять переменные, использованные в шаге 5 и следующие.

Код был бы таким:

#include <stdio.h> 
#include <string.h>  
int main() 
{ 
    char resultado[50] = ""; 
    char palabra[50];
    int i=0,j=0; 
    char *subcadena;

    printf("Ingresa una frase!\n");scanf("%s",palabra);

    // si se encuentra un punto en la palabra
    if (subcadena = strchr(palabra, '.')) {
        // actualiza los valores necesitados
        i = subcadena - palabra + 1;
        memcpy( resultado, palabra, i);
        j = strlen(resultado);
    }

    // atraviesa la palabra
    while(palabra[i]) 
    {
        // solo insertando los caracteres que no son puntos 
        if(palabra[i] != '.') 
            resultado[j++]=palabra[i]; 
        i++; 
    } 
    resultado[j]='\0'; 

    printf("\nEl resultado seria!\n%s",resultado); 

    getchar(); 
    return(0);
}
0
ответ дан 24.11.2019, 14:36
  • 1
    Хотя лично, если он был в твоем posici и # 243; n, ставить и # 237; если, вместо того, чтобы цепь обрабатывает он и # 237; дай то, что har и # 237; чтобы быть и # 237; чтобы использовать регулярные выражения, чтобы обнаруживать, если он v и # 225; lida или нет, и вновь спрашивать до тех пор, пока пользователь не вводил информацию v и # 225; lido – Alvaro Montoro♦ 13.04.2016, 05:09