Удалить из строки первую цифру

180
08 апреля 2022, 03:20

Программа переписывает из строки все буквы, пропуская цифры. А как сделать так, чтобы пропускалась только первая последовательность цифр? То есть, если строка "qwe23r5ty", то выведется "qwerty", а нужно чтобы было "qwer5ty"

#include <iostream>
#include <ctype.h>
using namespace std;
void main()
{
    char buffer[1024]; //Твоя строка которую вводишь
    char Result[1024] = { 0 }; //Результат
    cout << "Input string : ";
    gets_s(buffer);
    char* ptr = Result; //Указатель на строку Result
    for (int i = 0; i < strlen(buffer); i++) //Обойти всю строку по-символьно
    {
        if (!isdigit((unsigned char)buffer[i])) //Если символ не цифра
            *ptr++ = buffer[i]; //то пишим этот символ в Result и сдвигаем указатель на 1 байт
    }
    cout << endl << "Result : " << Result;
}
Answer 1

Во первых: если вы не передаете количество читаемых элеменов в gets_s, то эта функция не будет знать куда вставить завершающий символ '\0', и буффер может остаться без завершающего символа. Если вы уж используете std::cout для вывода, то почему не использовать и std::cin для более безопасного и наглядного ввода?

char buffer[1024]; //Твоя строка которую вводишь
char Result[1024] = { 0 }; //Результат
cout << "Input string : ";    
cin >> buffer;

Выполнить задуманное вами, можно разными способами, одним из которой является способ, предложенной пользователем Akina. Можно также просто использовать существующие в стандарте функции копирования и конкетации, сначала копируя количество символов, пока не встретилась цифра, а потом конкетация остальной части:

int n = 0;
const char* ptr = buffer;
while (!isdigit(*ptr++)) ++n;
strncpy_s(Result, buffer, n);
while (isdigit(*ptr)) ++ptr;
strcat_s(Result, ptr);    
cout << endl << "Result : " << Result;

Можно и ничего не копировать, а читать только необходимое:

char buffer[1024]; //Твоя строка которую вводишь   
cout << "Input string : ";
int i = 0;
/*пока следующий не прочитанный символ
не является цифрой*/
while (!( isdigit(cin.peek()) )) {
    cin >> buffer[i++];
}
/*пока следующий не прочитанный символ\
является цифрой, пропускаем*/
while (isdigit(cin.peek())) 
    cin.ignore();    
//теперь читаем все остальные символы
while (cin >> buffer[i++]);
buffer[i] = 0;
cout << buffer;

P.S. Теперь вернемся к началу наблюдений. Если вы используете инструменты из С++, такие как std::cout из заголовочного С++ файла и т.п., то уж используйте С++ строки вместо С_строк, и лишнюю память не займете, и код будет компактней и читабельней.

READ ALSO
C++, что значит наследование enum class

C++, что значит наследование enum class

Рассмотрим следующий код:

182
C++ выдаёт неправильные числа

C++ выдаёт неправильные числа

Дело в том, что недавно начал изучать C++вовремя написания первой простой программы столкнулся с проблемой, что на выводе программы выдаёт...

206
Как вызвать функцию, если не completed? (mask())

Как вызвать функцию, если не completed? (mask())

Собственно, когда пользователь ввел телефон, кнопка разблокируется, но стоит ему удалить цифру и ничего не происходит

174
Помогите с jQuery show/hide

Помогите с jQuery show/hide

Пытаюсь сделать что бы при наведении на блок показывалась картинка внутри него, таких блоков много, у меня при наведении на 1 блок картинки...

79