c++ string

12 отговора 550 прегледа
#1

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;
}

Отговор
в отговор на CObject #2

Re: c++ string

а доколкото разбирам искаш и да не променя входния стринг? е, много искаш, това да не е java...

Отговор
в отговор на CObject #3

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++);
}

:-))))

Отговор
в отговор на zaphod #4

Re: c++ string

Не го искам аз.
Аз трябваше да го направя:)

Отговор
в отговор на CObject #5

Re: c++ string

И още нещо - по-добре НЕ прави констукции от рода на - памет се даделя във фунцията, а този който я вика да освобождава паметта, засега най-добре спазвай простичкото - "който задля памт - той си я освобождава".

Zaphod

Отговор
в отговор на Zaphod® #6

Дребна забележка

Да де, ама освен латиница може да има и кирилица в стринга. А също така и разни шашави букви (ascents, diacriticals), които се преобразуват в главни по други правила.

Отговор
в отговор на pyrx #7

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...

Отговор
в отговор на Zaphod® #8

Re: 10x , обаче ...

Да така ще стане.
Обаче още се чудя защо в условието беше зададен прототипа като:

char* ToUpper(char* str, int len);

Това беше част от условието (заабравих да го спомена).

Карай ! Както и да е . Да не си губим времето с дребнавости

Отговор
в отговор на CObject #9

Re: 10x , обаче ...

хм, противоречиш си. така не само ще трябва да освободиш паметта за резултата, но и ти трябва да я заделиш. докато в твоя пример, поне заделянето беше във функцията

Отговор
в отговор на Zaphod® #10

Re: c++ string

правилно, особено ако мислиш да слагаш тая функция в .dll

Отговор
в отговор на Zaphod® #11

da, ama ne

char* dest

еее да, ама не. трябва предварително да заделиш големина за dest, колкото е strlen(src)+1.
това ще стане с malloc(dest, strlen(src)+1)
ама не съм сигурен дали точно е така синтаксиса на malloc, защото нямам пред себе си хелп

Отговор
в отговор на ¤ Wolfheart ¤ #12

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

Отговор
в отговор на Zaphod® #13

Re: c++ string

*dst++ =(*src)&223 ;
//Така правиш на upper case и кирилица и латиница
// Само не знам какво ли ще стане с пунктуацията :))))

Отговор