c++ string
12 отговора
550 прегледа
c++ string
Това по-долу работи, но не така както трябва.
Задачата е да се преобразува даден стринг
така че той да съдържа само големи букви без да се
използват C run-time функций за това.(Програмата трябва да бъде на C)
Искам да напиша функция която да върши цялата работа
без да ме ангажира допълнително когато я използвам.
Долния пример работи, но трябва да да освободя
паметта след връщане от функцията.
Може ли някой да ме насочи как да го направя !!!
#include "stdafx.h"
#include <string.h>
#include <iostream.h>
char* ToUpper(char* str, int len);
int main(int argc, char* argv[])
{
char* src = "TowaEStriNG";
int len = strlen(src);
char* res = ToUpper(src, len);
cout << res << endl;
delete res; // ОСВОБОЖДАВАМ ПАМЕТТА
return 0;
}
char* ToUpper(char* str, int len)
{
char* arrstr = new char[++len];
for(int i = 0; i < len; i++)
{
int offset = 0;
if ((str > 96) && (str < 123))
offset = 32;
arrstr = str - offset;
}
str = arrstr;
return str;
}
Задачата е да се преобразува даден стринг
така че той да съдържа само големи букви без да се
използват C run-time функций за това.(Програмата трябва да бъде на C)
Искам да напиша функция която да върши цялата работа
без да ме ангажира допълнително когато я използвам.
Долния пример работи, но трябва да да освободя
паметта след връщане от функцията.
Може ли някой да ме насочи как да го направя !!!
#include "stdafx.h"
#include <string.h>
#include <iostream.h>
char* ToUpper(char* str, int len);
int main(int argc, char* argv[])
{
char* src = "TowaEStriNG";
int len = strlen(src);
char* res = ToUpper(src, len);
cout << res << endl;
delete res; // ОСВОБОЖДАВАМ ПАМЕТТА
return 0;
}
char* ToUpper(char* str, int len)
{
char* arrstr = new char[++len];
for(int i = 0; i < len; i++)
{
int offset = 0;
if ((str > 96) && (str < 123))
offset = 32;
arrstr = str - offset;
}
str = arrstr;
return str;
}
Re: c++ string
а доколкото разбирам искаш и да не променя входния стринг? е, много искаш, това да не е java...
Re: c++ string
:-) pishesh kato na pascal...
eto ti f-iata
void StrToUpper(char* dest, const char* src)
{
do {
*dst++ = (*src>'a')&&(*src<'z') ? *src - 32 : *src;
while (*src++);
}
:-))))
eto ti f-iata
void StrToUpper(char* dest, const char* src)
{
do {
*dst++ = (*src>'a')&&(*src<'z') ? *src - 32 : *src;
while (*src++);
}
:-))))
Re: c++ string
И още нещо - по-добре НЕ прави констукции от рода на - памет се даделя във фунцията, а този който я вика да освобождава паметта, засега най-добре спазвай простичкото - "който задля памт - той си я освобождава".
Zaphod
Zaphod
Дребна забележка
Да де, ама освен латиница може да има и кирилица в стринга. А също така и разни шашави букви (ascents, diacriticals), които се преобразуват в главни по други правила. 
Re: Дребна забележка
da beshe kazal ko iska takova
, ima si pravilo za uspeh, pravish tochno tolkova kolkoto se iska, nito poveche nito po-malko :-)
A inache popravkite za kiriliza i dsugi vuvrdeni pravila za Capital - non capital sa ochevidni, osvn ako niakoi ne izmisli "nelineino" pravilo po koeto se razlochava Capital ot ne-capital vuv ascii...
A inache popravkite za kiriliza i dsugi vuvrdeni pravila za Capital - non capital sa ochevidni, osvn ako niakoi ne izmisli "nelineino" pravilo po koeto se razlochava Capital ot ne-capital vuv ascii...
Re: 10x , обаче ...
Да така ще стане.
Обаче още се чудя защо в условието беше зададен прототипа като:
char* ToUpper(char* str, int len);
Това беше част от условието (заабравих да го спомена).
Карай ! Както и да е . Да не си губим времето с дребнавости
Обаче още се чудя защо в условието беше зададен прототипа като:
char* ToUpper(char* str, int len);
Това беше част от условието (заабравих да го спомена).
Карай ! Както и да е . Да не си губим времето с дребнавости
Re: 10x , обаче ...
хм, противоречиш си. така не само ще трябва да освободиш паметта за резултата, но и ти трябва да я заделиш. докато в твоя пример, поне заделянето беше във функцията
da, ama ne
char* dest
еее да, ама не. трябва предварително да заделиш големина за dest, колкото е strlen(src)+1.
това ще стане с malloc(dest, strlen(src)+1)
ама не съм сигурен дали точно е така синтаксиса на malloc, защото нямам пред себе си хелп
еее да, ама не. трябва предварително да заделиш големина за dest, колкото е strlen(src)+1.
това ще стане с malloc(dest, strlen(src)+1)
ама не съм сигурен дали точно е така синтаксиса на malloc, защото нямам пред себе си хелп
Re: da, ama ne
Da, ama ne - ne e rabota na funciata koiato luchaa zadelena pamet da se grizhi da tova, iskashe se f-ia za upperstring. Ako iskash mozhe da se slozhivure allocationa na char* dest, i da zadelia dest = (char*) malloc(strlen(src)+1); no triabva li?
Ima 2 varianta - ideiata e koi da se pogrizhi za zadeliane na pamet, dori statisticata pokazva che ako koito zadelia doi osvobozhdava stavat po-malko greshki, dori ako ti e napravilo vpechatlenie vsichki CRT function na C za strind manipulation NE zadeliat pametta za rezultata - iavno ne e zashtoto ne mogad da si viknat edin malloc v tiah... iavno druga e prichinata
Ima 2 varianta - ideiata e koi da se pogrizhi za zadeliane na pamet, dori statisticata pokazva che ako koito zadelia doi osvobozhdava stavat po-malko greshki, dori ako ti e napravilo vpechatlenie vsichki CRT function na C za strind manipulation NE zadeliat pametta za rezultata - iavno ne e zashtoto ne mogad da si viknat edin malloc v tiah... iavno druga e prichinata
Re: c++ string
*dst++ =(*src)&223 ;
//Така правиш на upper case и кирилица и латиница
// Само не знам какво ли ще стане с пунктуацията :))))
//Така правиш на upper case и кирилица и латиница
// Само не знам какво ли ще стане с пунктуацията :))))