Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

найти в строке число

32K
17 декабря 2007 года
Mayachok
5 / / 17.12.2007
строка задана как char, в ней есть буквы, разные знаки + какое-либо целое число.
например PEREMENNAYA=124
подскажите, как из такой строки выделить число в отдельную переменную?
397
17 декабря 2007 года
SergPas
527 / / 03.02.2007
Только путём посимвольного анализа строки.
12K
18 декабря 2007 года
St0p
59 / / 15.04.2007
for(i=0; i<n; i++)//n - длинна строки, чтобы её найти можно использовать, например, strlen()
{
if(str==z)//str - стока, z - искомое число
{
y=z;
}
}
всё. Теперь возвращаешь y и его место под солнцем.
397
18 декабря 2007 года
SergPas
527 / / 03.02.2007
Цитата:

for(i=0; i<n; i++)//n - длинна строки, чтобы её найти можно использовать, например, strlen()
{
if(str==z)//str - стока, z - искомое число
{
y=z;
}
}


Вот пример плохого кода. :eek:

12K
18 декабря 2007 года
St0p
59 / / 15.04.2007
Цитата: SergPas
Вот пример плохого кода. :eek:



Многоуважаемый товарищ) В данном случае я и не претендую) Дело в том, что я знаю, что этот код врятли будет использован вообще кем-либо когда-либо. И не приведи господь, если кому-то он понравится.. Но суть вопроса, имхо, он отображает вполне конкретезировано. Прогнать строку, выцепить понравившийся элемент и вернуть его.) Если чем-то задел - извиняюсь, не специально.)

255
18 декабря 2007 года
Dart Bobr
1.4K / / 09.04.2004
Уважаемый, начнем с того, что данный код просто не рабочий.
Потому-что:
он ищет цифры а не числа (вы пробовали его запустить на приведенном афтором топика примере?сомневаюсь), к тому же вы не описали типов и не инициализировали переменнные, а для автора топика, готов поспорить, это является не очевидным. (к тому же у вас отсутствует приведение из типа char в int. так как 0х03 не есть символом '3', к примеру!! )
Так зачем тогда постить заведомо неправильный код? Даже если он, по вашему мнению, не будет ни разу использован, имейте уважение к тем, кто будет читать этот топик и не пишите глупостей, если вы их осознаете.

З.Ы. Стиль написания честно ужастный, без обид. К тому же почему бы не использовать (смотрим на название раздела) С++ а не С?
13K
18 декабря 2007 года
specter
113 / / 28.09.2007
Цитата: Mayachok
строка задана как char, в ней есть буквы, разные знаки + какое-либо целое число.
например PEREMENNAYA=124
подскажите, как из такой строки выделить число в отдельную переменную?


Тут удобнее всего будет использовать регулярные выражения ;)

6.4K
18 декабря 2007 года
Host
122 / / 22.09.2005
Цитата: Mayachok
...подскажите, как из такой строки выделить число в отдельную переменную?



Функции по работе с символами и си-строками:
http://www.cppreference.com/stdstring/index.html

пример:

Код:
[SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][SIZE=2] NumberFromString([/SIZE][SIZE=2][COLOR=#0000ff]const [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]char[/COLOR][/SIZE][SIZE=2]* szTestString)[/SIZE]
[SIZE=2]{[/SIZE]
[SIZE=2][COLOR=#0000ff]for[/COLOR][/SIZE][SIZE=2]([/SIZE][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][SIZE=2] i = 0; i<strlen(szTestString); i++)[/SIZE]
[SIZE=2]{[/SIZE]
[SIZE=2][COLOR=#0000ff]   if[/COLOR][/SIZE][SIZE=2](isdigit(szTestString))[/SIZE]
[SIZE=2]   {[/SIZE]
[SIZE=2][COLOR=#0000ff]      return[/COLOR][/SIZE][SIZE=2] atoi(&szTestString);[/SIZE]
[SIZE=2]   }[/SIZE]
[SIZE=2]}[/SIZE]
[SIZE=2][COLOR=#0000ff]return[/COLOR][/SIZE][SIZE=2] -1;[/SIZE]
[SIZE=2]}[/SIZE]
12K
18 декабря 2007 года
St0p
59 / / 15.04.2007
Цитата: Dart Bobr
Уважаемый, начнем с того, что данный код просто не рабочий.
Потому-что:
он ищет цифры а не числа (вы пробовали его запустить на приведенном афтором топика примере?сомневаюсь), к тому же вы не описали типов и не инициализировали переменнные, а для автора топика, готов поспорить, это является не очевидным. (к тому же у вас отсутствует приведение из типа char в int. так как 0х03 не есть символом '3', к примеру!! )
Так зачем тогда постить заведомо неправильный код? Даже если он, по вашему мнению, не будет ни разу использован, имейте уважение к тем, кто будет читать этот топик и не пишите глупостей, если вы их осознаете.

З.Ы. Стиль написания честно ужастный, без обид. К тому же почему бы не использовать (смотрим на название раздела) С++ а не С?



Согласен, виноват, испарвлюсь) Убидили)

32K
20 декабря 2007 года
Mayachok
5 / / 17.12.2007
спасибо всем. с помощью регулярок сделаю (вот только надо будет подучиться с ними работать)
538
21 декабря 2007 года
AVDEY
188 / / 17.11.2005
Вот как я использовал перевод строки в числовой тип double:
Код:
double StringDouble(CString Sstr)
{

char cBuf;
double ret=0,iDrob=1,iDrobBuf=1;
int iSize=0,iMeter=0,iCile=10,iZnak=1;

iSize=Sstr.GetLength();
if(iSize==0)return 0;
if((Sstr.GetAt(0))=='-')
{iZnak=-1;iMeter++;}
while(iMeter<iSize)
        {

cBuf=Sstr.GetAt(iMeter);
iDrob=iDrob*iDrobBuf;
           
    switch(cBuf)
    {
        case '.':{iCile=1;iDrobBuf=0.1;}break;
        case '0':ret=ret*iCile+0*iDrob;break;
        case '1':ret=ret*iCile+1*iDrob;break;
        case '2':ret=ret*iCile+2*iDrob;break;
        case '3':ret=ret*iCile+3*iDrob;break;
        case '4':ret=ret*iCile+4*iDrob;break;
        case '5':ret=ret*iCile+5*iDrob;break;
        case '6':ret=ret*iCile+6*iDrob;break;
        case '7':ret=ret*iCile+7*iDrob;break;
        case '8':ret=ret*iCile+8*iDrob;break;
        case '9':ret=ret*iCile+9*iDrob;break;
   
    }
iMeter++;}
ret=ret*iZnak;

return ret;
}

Но это было сделано только для того случая, когда заранее известно что строка содержит только цифровые символы, иначе эта функция просто сложит все цифровые символы в одну цифру.
Если я правильно понял вопрос думаю что подойдет,если дописать:
 
Код:
switch(...)
{
case 0:{}break;
//...............................
//...............................
//...............................
 default: {ret=ret*iZnak; return ret;}
}
32K
24 декабря 2007 года
Mayachok
5 / / 17.12.2007
возможно ли сделать это без регулярных выражений?
в строке присутствуют не только цифры, но и символы. причем какое чилсо будет в строке - неизвестно. как раз его и надо найти
1.6K
24 декабря 2007 года
Vov4ick
476 / / 01.02.2007
Примерно такой алгоритм:
Проходим строку посимвольно, пока не встретим конец строки, либо пока не встретим символ ( char >='0' && char <='9' ). Если конец строки - выход.
Если символ встретили, записываем в конец пустой строки пока. Далее проходим оставшуюся часть строки пока ( char >='0' && char <='9' ).
Далее sprintf() с нужными параметрами.
В случае чисел с плав. запятой в оба сравнения добавляется проверка на запятую или точку.
При необходимости разбора массива повторяем до встречиконца строки.
3
24 декабря 2007 года
Green
4.8K / / 20.01.2000
Цитата: AVDEY
Вот как я использовал перевод строки в числовой тип double:
Код:
switch(cBuf)
    {
        case '.':{iCile=1;iDrobBuf=0.1;}break;
        case '0':ret=ret*iCile+0*iDrob;break;
        case '1':ret=ret*iCile+1*iDrob;break;
        case '2':ret=ret*iCile+2*iDrob;break;
        case '3':ret=ret*iCile+3*iDrob;break;
        case '4':ret=ret*iCile+4*iDrob;break;
        case '5':ret=ret*iCile+5*iDrob;break;
        case '6':ret=ret*iCile+6*iDrob;break;
        case '7':ret=ret*iCile+7*iDrob;break;
        case '8':ret=ret*iCile+8*iDrob;break;
        case '9':ret=ret*iCile+9*iDrob;break;
   
    }


Жуть... :)
Хорошо, что цифр всего 10. :D:D

353
24 декабря 2007 года
Nixus
840 / / 04.01.2007
Код:
#include <stdio.h>

int getNum(const char* szStr)
{
    int outNum = 0;
    int bNum = 0;
    const char *p = szStr;

    while(*p)
    {
        if(*p >= '0' && *p <= '9')
        {
            bNum = 1;
            outNum = outNum* 10 + (*p - '0');
        }
        else
        {
            if(bNum)
                break;
        }

        p++;
    }

    return outNum;
}

main()
{
    printf("%i\n", getNum("qwe=123wer"));
    printf("%i\n", getNum("gkwehrkjhwekt679012wer"));
    printf("%i\n", getNum("qwkehqwkjeg64897126498qwr"));
}
538
24 декабря 2007 года
AVDEY
188 / / 17.11.2005
Цитата: Green
Жуть... :)
Хорошо, что цифр всего 10. :D:D



А что есть другие варианты, кроме сравнения символов.
И задача стоит определить именно цифры.

3
24 декабря 2007 года
Green
4.8K / / 20.01.2000
Цитата: AVDEY
А что есть другие варианты, кроме сравнения символов.
И задача стоит определить именно цифры.


А зачем сравнивать все символы?
Для того, чтоб определить, что символ является цифрой, достаточно сделать такую проверку:

 
Код:
(ch >= '0' && ch <= '9')

а для того, чтоб определить, какой цифрой является символ достаточно произвести такое действие:
 
Код:
ch - '0';

Т.о. твой гигантский switch вырождается в следущее:
 
Код:
if(ch == '.') {
        .....
    } else {
        unsigned int val = ch - '0';
        if(val <= 9) {
            .....
        }
    }

Да и ещё, для точности, я бы не выделял бы сначала целую и дробную часть, а сначала сконвертировал бы строку чисел в целочисленное значение (без учета точки), а уж потом разделил бы.
353
25 декабря 2007 года
Nixus
840 / / 04.01.2007
Цитата: Green
Да и ещё, для точности, я бы не выделял бы сначала целую и дробную часть, а сначала сконвертировал бы строку чисел в целочисленное значение (без учета точки), а уж потом разделил бы.


А еще луше два целых для хранения целой и дробной части отдельно и последующего перевода.

32K
25 декабря 2007 года
Mayachok
5 / / 17.12.2007
сделала вот так вот:

int NumberFromString(const char* szTestString)
{
for(int i = 0; i<strlen(szTestString); i++)
{
if(isdigit(szTestString))
{
return atoi(&szTestString);
}
}
}

работает как надо и занимает мало места :)
538
25 декабря 2007 года
AVDEY
188 / / 17.11.2005
Спасибо за предложенные варианты, переделаю функцию, а то ту функцию я писал когда еще был на втором или на первом курсе института. И как то не было обходимости чтото изменять.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог