найти в строке число
например PEREMENNAYA=124
подскажите, как из такой строки выделить число в отдельную переменную?
{
if(str==z)//str - стока, z - искомое число
{
y=z;
}
}
всё. Теперь возвращаешь y и его место под солнцем.
for(i=0; i<n; i++)//n - длинна строки, чтобы её найти можно использовать, например, strlen()
{
if(str==z)//str - стока, z - искомое число
{
y=z;
}
}
Вот пример плохого кода. :eek:
Многоуважаемый товарищ) В данном случае я и не претендую) Дело в том, что я знаю, что этот код врятли будет использован вообще кем-либо когда-либо. И не приведи господь, если кому-то он понравится.. Но суть вопроса, имхо, он отображает вполне конкретезировано. Прогнать строку, выцепить понравившийся элемент и вернуть его.) Если чем-то задел - извиняюсь, не специально.)
Потому-что:
он ищет цифры а не числа (вы пробовали его запустить на приведенном афтором топика примере?сомневаюсь), к тому же вы не описали типов и не инициализировали переменнные, а для автора топика, готов поспорить, это является не очевидным. (к тому же у вас отсутствует приведение из типа char в int. так как 0х03 не есть символом '3', к примеру!! )
Так зачем тогда постить заведомо неправильный код? Даже если он, по вашему мнению, не будет ни разу использован, имейте уважение к тем, кто будет читать этот топик и не пишите глупостей, если вы их осознаете.
З.Ы. Стиль написания честно ужастный, без обид. К тому же почему бы не использовать (смотрим на название раздела) С++ а не С?
например PEREMENNAYA=124
подскажите, как из такой строки выделить число в отдельную переменную?
Тут удобнее всего будет использовать регулярные выражения ;)
Функции по работе с символами и си-строками:
http://www.cppreference.com/stdstring/index.html
пример:
[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]
Потому-что:
он ищет цифры а не числа (вы пробовали его запустить на приведенном афтором топика примере?сомневаюсь), к тому же вы не описали типов и не инициализировали переменнные, а для автора топика, готов поспорить, это является не очевидным. (к тому же у вас отсутствует приведение из типа char в int. так как 0х03 не есть символом '3', к примеру!! )
Так зачем тогда постить заведомо неправильный код? Даже если он, по вашему мнению, не будет ни разу использован, имейте уважение к тем, кто будет читать этот топик и не пишите глупостей, если вы их осознаете.
З.Ы. Стиль написания честно ужастный, без обид. К тому же почему бы не использовать (смотрим на название раздела) С++ а не С?
Согласен, виноват, испарвлюсь) Убидили)
{
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;
}
Но это было сделано только для того случая, когда заранее известно что строка содержит только цифровые символы, иначе эта функция просто сложит все цифровые символы в одну цифру.
Если я правильно понял вопрос думаю что подойдет,если дописать:
{
case 0:{}break;
//...............................
//...............................
//...............................
default: {ret=ret*iZnak; return ret;}
}
в строке присутствуют не только цифры, но и символы. причем какое чилсо будет в строке - неизвестно. как раз его и надо найти
Проходим строку посимвольно, пока не встретим конец строки, либо пока не встретим символ ( char >='0' && char <='9' ). Если конец строки - выход.
Если символ встретили, записываем в конец пустой строки пока. Далее проходим оставшуюся часть строки пока ( char >='0' && char <='9' ).
Далее sprintf() с нужными параметрами.
В случае чисел с плав. запятой в оба сравнения добавляется проверка на запятую или точку.
При необходимости разбора массива повторяем до встречиконца строки.
{
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
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"));
}
Хорошо, что цифр всего 10. :D:D
А что есть другие варианты, кроме сравнения символов.
И задача стоит определить именно цифры.
И задача стоит определить именно цифры.
А зачем сравнивать все символы?
Для того, чтоб определить, что символ является цифрой, достаточно сделать такую проверку:
а для того, чтоб определить, какой цифрой является символ достаточно произвести такое действие:
Т.о. твой гигантский switch вырождается в следущее:
.....
} else {
unsigned int val = ch - '0';
if(val <= 9) {
.....
}
}
Да и ещё, для точности, я бы не выделял бы сначала целую и дробную часть, а сначала сконвертировал бы строку чисел в целочисленное значение (без учета точки), а уж потом разделил бы.
А еще луше два целых для хранения целой и дробной части отдельно и последующего перевода.
int NumberFromString(const char* szTestString)
{
for(int i = 0; i<strlen(szTestString); i++)
{
if(isdigit(szTestString))
{
return atoi(&szTestString);
}
}
}
работает как надо и занимает мало места :)