С++:Поиск чисел(не цифр) в строке (маразм какой та...)

Модератор: Модераторы разделов

Аватара пользователя
Kataklysm
Сообщения: 280
ОС: Linux Suse 10.2-10.3 Sles-10.1

С++:Поиск чисел(не цифр) в строке

Сообщение Kataklysm »

Допустим в файле написано следующее:

Код: Выделить всё

asfsdfjwe323kj123ljlj123lljk1

Вопрос:
Как выполнить поиск чисел(не цифр) в данной ситуации и заменить данные числа на hex вид.

Код: Выделить всё

if((c >= '0') && (c <= '9'))
k++;
Большая просьба не путать число от цифры. :rolleyes:
Спасибо.

P.S.С++
Спасибо сказали:
apprentice
Сообщения: 595
ОС: Debian 6

Re: С++:Поиск чисел(не цифр) в строке

Сообщение apprentice »

а в чем проблема?

копируете все не числовые символы в один буфер, когда встречаете числовой символ начинаете копировть в другой буфер, затем делаете преобразование и результат копируете в первый буфер.
Спасибо сказали:
Аватара пользователя
Kataklysm
Сообщения: 280
ОС: Linux Suse 10.2-10.3 Sles-10.1

Re: С++:Поиск чисел(не цифр) в строке

Сообщение Kataklysm »

apprentice писал(а):
28.12.2009 13:58
а в чем проблема?

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


Ну проблема как раз таки в моих знаниях :mellow: . Если не сложно напишите пожалуйста пример.
Спасибо сказали:
apprentice
Сообщения: 595
ОС: Debian 6

Re: С++:Поиск чисел(не цифр) в строке

Сообщение apprentice »

если делать в стиле Си вам нужны функции

open,malloc,read,write,stat,close,atoi,sprintf

либо использовать потоки в стиле С++.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: С++:Поиск чисел(не цифр) в строке

Сообщение NickLion »

Вот! :crazy:

Код: Выделить всё

#include <stdio.h>

int main() {
    const char* str = "asfsdfjwe323kj123ljlj123lljk1";
    char out[1024];

    int n = 0; bool q = false;
    const char* c; char* k;
    for( c = str, k = out;; c++ ) {
        if( 10 > (unsigned char) ( *c - '0' ) ) {
            q = true;
            ( n *= 10 ) += *c - '0';
        } else {
            if( q ) {
                int l = n;
                do { k++; l >>= 4; } while( l );
                char* m = k;
                do {
                    if( ( *--m = '0' + ( n & 15 ) ) > '9' )
                        *m += 'a' - ( '9' + 1 );
                    n >>= 4;
                } while( n );
                q = false;
            }
            if( !( *k++ = *c ) ) break;
        }
    }

    printf( "%s", out );
    return 0;
}
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: С++:Поиск чисел(не цифр) в строке

Сообщение RasenHerz »

NickLion писал(а):
28.12.2009 16:38
Вот! :crazy:

Хороший пример того как нельзя писать на С++ ;)
Спасибо сказали:
Аватара пользователя
Kataklysm
Сообщения: 280
ОС: Linux Suse 10.2-10.3 Sles-10.1

Re: С++:Поиск чисел(не цифр) в строке

Сообщение Kataklysm »

RasenHerz писал(а):
28.12.2009 19:21
NickLion писал(а):
28.12.2009 16:38
Вот! :crazy:

Хороший пример того как нельзя писать на С++ ;)


+1, т.к. нужен чистый С++, без элементов С. У меня получилось примерно так:

Код: Выделить всё

            while(b.get(c[0]))
                    {
                        if((c[0] >= '0') && (c[0] <= '9'))//количество чисел в строке
                        {
                                strcat(chislo[i],&c[0]);
                        }
                        else
                        {
                                if(*chislo[i])
                                {
                                        //cout<<chislo[i]<<" ";
                                        delete chislo[i];
                                        i++;
                                        chislo[i] = new char[11];
                                }
                        }
                }
                cout<<"Количество десятичных чисел в строке:" <<i<<endl;
        }
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: С++:Поиск чисел(не цифр) в строке

Сообщение watashiwa_daredeska »

Kataklysm писал(а):
28.12.2009 19:43
strcat
Это не C++, а C.

Kataklysm писал(а):
28.12.2009 19:43
chislo[i] = new char[11];
Почему 11?

А где, собственно, перевод в hex?
Спасибо сказали:
Аватара пользователя
agentprog
Сообщения: 362
Статус: Ad Astra per aspera
ОС: openSUSE 11.4, Arch

Re: С++:Поиск чисел(не цифр) в строке

Сообщение agentprog »

Kataklysm писал(а):
28.12.2009 19:43
т.к. нужен чистый С++, без элементов С

но
Kataklysm писал(а):
28.12.2009 19:43
strcat(chislo[i],&c[0]);

тогда уж используем std::string вместо char* и вместо strcat используем + ;)
No problems - just solutions!
Спасибо сказали:
Аватара пользователя
Kataklysm
Сообщения: 280
ОС: Linux Suse 10.2-10.3 Sles-10.1

Re: С++:Поиск чисел(не цифр) в строке

Сообщение Kataklysm »

watashiwa_daredeska писал(а):
28.12.2009 20:01
Kataklysm писал(а):
28.12.2009 19:43
strcat
Это не C++, а C.

хм...

Почему 11?
А где, собственно, перевод в hex?

11 - вообще поставил на угад, если честно. А перевод в hex пока думаю, т.к. имею затруднительность в отображении всего файла с заменой десятичных чисел на 16-ти
Спасибо сказали:
Аватара пользователя
Crazy
Сообщения: 862
Статус: Адепт Дзен.
ОС: Mint, Win7.

Re: С++:Поиск чисел(не цифр) в строке

Сообщение Crazy »

Выделяешь число, смотришь сколько занимает байт, потом переводишь в hex

Код: Выделить всё

#include <iostream>

unsigned char TETR_TO_HEX(unsigned char tetr)
{
    tetr=tetr&0x0F;
    if(tetr<10)
    {
        tetr+='0';
    }
    else
    {
        tetr-=10;
        tetr+='A';
    }
    return tetr;
}
void BYTE_TO_HEX(unsigned char byte)
{
    char L = TETR_TO_HEX(byte);
    byte=byte>>4;
    char H = TETR_TO_HEX(byte);
    std::cout<<H<<L<<std::endl;
}
int main()
{
    BYTE_TO_HEX(255);
    BYTE_TO_HEX(12);
    BYTE_TO_HEX(32);
    BYTE_TO_HEX(128);
    BYTE_TO_HEX(33);
    return 0;
}

Desipere in loco
Спасибо сказали:
Аватара пользователя
--=Civil696=--
Сообщения: 227
ОС: Gentoo o_O

Re: С++:Поиск чисел(не цифр) в строке

Сообщение --=Civil696=-- »

Жуткий быдлокодище, но вроде работает, если я вообще правильно понял, что нужно. :blush:
Делает так:

Код: Выделить всё

navi ~ $ ./a.out
1llll2llll3lll10llll11lll12lll15lll16lll20
<^D>
1llll2llll3lllallllblllclllflll10lll14


Код: Выделить всё

#include <iostream>
#include <strstream>
#include <cctype>

using namespace std;

int main() {

    char c;
    strstream buf;

    while(cin.get(c)) {

        if(isdigit(c)) {

            strstream snum;

            do {

                snum << c;

            } while (cin.get(c) && isdigit(c));

            int num;

            snum >> num;
            buf << hex << num;
        }

        buf << c;
    }

    cout << buf.str();

    return 0;
}
НЕ ПАНИКУЙ © ^_~
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: С++:Поиск чисел(не цифр) в строке

Сообщение NickLion »

RasenHerz писал(а):
28.12.2009 19:21
NickLion писал(а):
28.12.2009 16:38
Вот! :crazy:

Хороший пример того как нельзя писать на С++ ;)

Не-не-не! Это специально написанный пример как МОЖНО, но не НУЖНО писать на C++ :) Но разве не работает? ;)
Я просто ответил так потому что: "Темы от студентов с запросами готовых решений по заданиям зарываются не глядя."
А каких-то попыток со стороны ТС не увидел.

Kataklysm писал(а):
28.12.2009 19:43
+1, т.к. нужен чистый С++, без элементов С. У меня получилось примерно так:

Это невозможно. Не существует никакого чистого С++, чистый С - да, существует. Вот хотя бы цикл for - уже элемент C, или там функция main ;)
Спасибо сказали:
Аватара пользователя
deadhead
Сообщения: 1913
Статус: zzz..z

Re: С++:Поиск чисел(не цифр) в строке

Сообщение deadhead »

NickLion писал(а):
29.12.2009 07:50
Не существует никакого чистого С++, чистый С - да, существует. Вот хотя бы цикл for - уже элемент C, или там функция main

Ну вы "отожгли" :-)

Си++ не включает в себя Си
[x] close
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: С++:Поиск чисел(не цифр) в строке

Сообщение drBatty »

Kataklysm писал(а):
28.12.2009 20:13
А перевод в hex пока думаю, т.к. имею затруднительность в отображении всего файла с заменой десятичных чисел на 16-ти

int sprintf()
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: С++:Поиск чисел(не цифр) в строке

Сообщение watashiwa_daredeska »

drBatty писал(а):
29.12.2009 14:18
int sprintf()
Лучше сразу веником убиться, чтоб не мучаться.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: С++:Поиск чисел(не цифр) в строке

Сообщение NickLion »

deadhead писал(а):
29.12.2009 12:12
NickLion писал(а):
29.12.2009 07:50
Не существует никакого чистого С++, чистый С - да, существует. Вот хотя бы цикл for - уже элемент C, или там функция main

Ну вы "отожгли" :-)

Си++ не включает в себя Си

Ну и чем я отжёг? Я прекрасно знаю, что С++ не включает в себя С. Но он построен на основе С и чистого С++ не существует - это маразм.
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: С++:Поиск чисел(не цифр) в строке

Сообщение diesel »

NickLion писал(а):
29.12.2009 16:53
deadhead писал(а):
29.12.2009 12:12
NickLion писал(а):
29.12.2009 07:50
Не существует никакого чистого С++, чистый С - да, существует. Вот хотя бы цикл for - уже элемент C, или там функция main

Ну вы "отожгли" :-)

Си++ не включает в себя Си

Ну и чем я отжёг? Я прекрасно знаю, что С++ не включает в себя С. Но он построен на основе С и чистого С++ не существует - это маразм.


Безусловно С++ многим обязан языку С [8], который сохраняется как его
подмножество. Сохранены и все свойственные С средства низкого уровня,
предназначенные для решения самых насущных задач системного
программирования.
.....
Развитие языка С++ происходило на базе языка С, и, за небольшим
исключением, С был сохранен в качестве подмножества C++.
Базовый язык С
был спроектирован таким образом, что имеется очень тесная связь между
типами, операциями, операторами и объектами, с которыми непосредственно
работает машина, т.е. числами, символами и адресами. За исключением
операций new, delete и throw, а также проверяемого блока, для выполнения
операторов и выражений С++ не требуется скрытой динамической аппаратной
или программной поддержки.

Собственно это из книги Страуструпа(http://lib.ru/CPPHB/cpptut.txt). Уж не знаю кому верить всемирному разуму или автору языка.

ЗЫ: кстати статья в википедии содержит взаимоисключающие параграфы :)
Спасибо сказали:
Аватара пользователя
Crazy
Сообщения: 862
Статус: Адепт Дзен.
ОС: Mint, Win7.

Re: С++:Поиск чисел(не цифр) в строке

Сообщение Crazy »

Страуструп называет его еще "мультипарадигменный язык программирования", так что какая разница в использования тех или иных средств предоставляемых языком?

Desipere in loco
Спасибо сказали: