[c++] string.resize

Pagina: 1
Acties:

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

Topicstarter
ik ben voor school bezig met C++ opdracht (practicum)
En omdat ik mijn docent niet lastig wil vallen, val ik jullie maar lastig..

ik heb deze code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <string>

using namespace std;
string keerOm(string& result, string& origineel);

int main()
{
      keerOm("hallo", "dit is een test");
      string test;
      getline(cin, test);
      return 0;
}

string keerOm(string& result, string& origineel)
{
      result.resize(origineel.length());
      cout << origineel.length() << ":" << result.length();
      return result;
}

ik wil dus result resizen, maar ik krijg de output:
15:20

waarom is result niet gewoon 15? en hoe zorg ik dat ie dat wel wordt?

Verwijderd

- heb geen verstand van C :) -

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

Topicstarter
Op maandag 18 februari 2002 11:39 schreef daNpy het volgende:
3e regel van onder staat 'cout' moet dat niet 'count' zijn :?
cout is de standaard out van c.
Zeg maar de System.out.print van java ;)
of de echo(); van PHP :)

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

Topicstarter
okay ik heb het smerig opgelost, al ben ik er van overtuigd dat het anders kan...
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <string>

using namespace std;
string keerOm(string& result, string& origineel);

int main()
{
      cout << keerOm("hallo", "dit is een test");
      string test;
      getline(cin, test);
      return 0;
}

string keerOm(string& result, string& origineel)
{
      int length = origineel.length();
      result.resize(length - result.length());
      cout << origineel.length() << ":" << result.length();
      for (int i = 0; i < length; i++)
      {
            result.at(length - i - 1) = origineel.at(i);
      }
      return result;
}

  • Sjonny
  • Registratie: Maart 2001
  • Laatst online: 19:01

Sjonny

Fratser

als ik jou 1e versie probeer krijg ik dit:
code:
1
2
3
4
5
crap.cpp: In function `int main()':
crap.cpp:10: initializing non-const `string &' with `const char *' will use a temporary
crap.cpp:6: in passing argument 1 of `keerOm(string &, string &)'
crap.cpp:10: initializing non-const `string &' with `const char *' will use a temporary
crap.cpp:6: in passing argument 2 of `keerOm(string &, string &)'

dus die compiled niet eens bij mij. maar als ik het zo aan pak werkt het wel:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <string>

using namespace std;

string keerOm(string& result, string& origineel);

int main()
{
      string s("hallo");
      string t("dit is een test");
      keerOm(s, t);
      return 0;
}

string keerOm(string& result, string& origineel)
{
      result.resize(origineel.length());
      cout << origineel.length() << ":" << result.length();
      return result;
}

g++ 2.95.4

The problem is in the part of your brain that handles intelligence.


  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

Topicstarter
ja die warning's krijg ik ook..

maar toch compiled ie...

(borland c++ builder 4)

Verwijderd

Op maandag 18 februari 2002 11:45 schreef wasigh het volgende:
okay ik heb het smerig opgelost, al ben ik er van overtuigd dat het anders kan...
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <string>

using namespace std;
string keerOm(string& result, string& origineel);

int main()
{
      cout << keerOm("hallo", "dit is een test");
      string test;
      getline(cin, test);
      return 0;
}

string keerOm(string& result, string& origineel)
{
      int length = origineel.length();
      result.resize(length - result.length());
      cout << origineel.length() << ":" << result.length();
      for (int i = 0; i < length; i++)
      {
            result.at(length - i - 1) = origineel.at(i);
      }
      return result;
}
Nu vraag ik mij nog steeds af waarom je result uberhaupt meegeeft aan die functie? Op dit moment geef je result mee en return je hem ook nog....??? waarom niet:
code:
1
2
3
4
5
6
string keerOm(string & orig)
{
  string result;
  //do something
  return result;
}

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

Topicstarter
omdat in de opdracht staat dat ik dat moet doen..
(ik zie zelf het nut ook niet echt..)

Verwijderd

Dan begrijp je de opdracht niet of de opdracht zuigt gewoon enorm... Waarschijnelijk de eerste...

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

Topicstarter
Op maandag 18 februari 2002 11:56 schreef vicz het volgende:
Dan begrijp je de opdracht niet of de opdracht zuigt gewoon enorm... Waarschijnelijk de eerste...
letterlijk uit dictaat:
Schrijf een functie die de karakters van een text string in omgekeerde volgorde zet,
Klaas ==> saalK
je geeft 2 pointers mee: 1 wijst naar de string, de ander naar het resultaat.
Test de functie met de volgende aanroep:
cout << keerOm(result, string) << endl;

;)

Verwijderd

Oke... ik neem mijn woorden terug.... deze opdracht zuigt enorm. ;)

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

Topicstarter
Op maandag 18 februari 2002 12:00 schreef vicz het volgende:
Oke... ik neem mijn woorden terug.... deze opdracht zuigt enorm. ;)
Dan zijn we het eens ;)
(mijn liefde voor c++ groeit iig niet door zo'n opdracht ;) )

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 11-09 08:26

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op maandag 18 februari 2002 11:54 schreef wasigh het volgende:
omdat in de opdracht staat dat ik dat moet doen..
(ik zie zelf het nut ook niet echt..)
dat is handig omdat je dan het resultaat meteen kan bewerken in dezelfde statement (bijvoorbeeld als parameter voor een andere functie) :)

bijvoorbeeld
code:
1
doeIets (keerOm (buffer, "blaat"));

Maar goed, verder snap ik niet waarom je eerste versie niet goed werkt, het hoort gewoon goed te werken... Als je de contents van result nou ook eens output, wat krijg je dan? Moet je wel even iets als result.resize (original.length (), 't') ofzo doen zodat je de spaties kan tellen :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • The End
  • Registratie: Maart 2000
  • Laatst online: 15:55

The End

!Beginning

<edit>never mind, dat was al duidelijk :) <\edit>

Verwijderd

Op maandag 18 februari 2002 12:10 schreef OiSyN het volgende:

[..]

dat is handig omdat je dan het resultaat meteen kan bewerken in dezelfde statement (bijvoorbeeld als parameter voor een andere functie) :)
mmmja.... maar dan hoef je nog steeds die buffer niet mee te geven.

Verwijderd

Op maandag 18 februari 2002 11:59 schreef wasigh het volgende:
letterlijk uit dictaat:
Schrijf een functie die de karakters van een text string in omgekeerde volgorde zet,
Schrijf maar op in je antwoordenboek:

"Die bestaat al,
code:
1
std::reverse(str.begin(),str.end());

does the job."

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

Topicstarter
Op maandag 18 februari 2002 12:40 schreef Sneech het volgende:

[..]

Schrijf maar op in je antwoordenboek:

"Die bestaat al,
code:
1
std::reverse(str.begin(),str.end());

does the job."
Ik moet de code inleveren voor punt ;)
en de bedoeling is dat ik met pointers om leer gaan...

(waarom een taal leren die 30 jaar oud is |:( ;) en die te lam is om ff nog een keer de source te parsen om de methode namen op te zoeken (FI ;) ))

Verwijderd

Op maandag 18 februari 2002 12:45 schreef wasigh het volgende:

[..]

Ik moet de code inleveren voor punt ;)
en de bedoeling is dat ik met pointers om leer gaan...
Zoek dan ff de implementatie van std::reverse op, kun je meteen extra punten verdienen door te zeggen dat je em generiek en daardoor herbruikbaarder hebt gemaakt ;).
(waarom een taal leren die 30 jaar oud is |:( ;) en die te lam is om ff nog een keer de source te parsen om de methode namen op te zoeken (FI ;) ))
Beetje off-topic :?

Overigens ben ik het wel met je eens wat dat parsen betreft.

Verwijderd

Tja... c/c++ wordt gewoon nog erg veel gebruikt.

  • Korben
  • Registratie: Januari 2001
  • Laatst online: 14-11-2025

Korben

() => {};

Om de eerste vraag te beantwoorden (wat jullie blijkbaar allemaal vergeten ;))...

Ik heb weinig tot geen verstand van de STL (string zit toch in de STL of niet? :?) maar wel van gewoon C++, en daar is het zo dat als je een string aanmaakt, je dit doet:
code:
1
char *blaat = new char[255];

Zo maak je een string (rij van characters == string) blaat met als maximale lengte 254 (255 min het nulteken). Als je nu strlen(blaat) doet kun je elke waarde terugkrijgen, omdat er nog random shit op die geheugenadressen staat. In het geval van Wasigh moet je dus - denk ik - eerst die resize() aanroepen om geheugen te reserveren, en dan een waarde erin zetten. Waarschijnlijk is het in jouw voorbeeld zo dat er 20 'gewone tekens' in het geheugen staan op de plaats van die string, en daarna pas een nulteken. Dus, ik zou dit doen:
code:
1
2
3
4
5
6
7
8
9
10
string keerOm(string &result, string &origineel)
{
   result.resize(origineel.length());

   // doe iets met de string...

   cout << origineel.length() << ":" << result.length() << endl;

   return result;
}

Nu zul je waarschijnlijk zien dat het wel klopt. Maar, zoals gezegd, 'waarschijnlijk'. :)

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?


Verwijderd

Xenophage:

Hmm, std::string is toch echt andere koek dan char[] hoor. Ik raad je aan toch eens naar die STL te kijken (zeker als je in dit soort gevallen advies wil geven).

  • Korben
  • Registratie: Januari 2001
  • Laatst online: 14-11-2025

Korben

() => {};

Xnap best dat STL anders is dan char *, maar ik probeerde alleen maar een hint in de goede richting te geven. Ik zal wel es kijken naar de STL, en dan nog es proberen :).

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?


Verwijderd

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <string>

using namespace std;

string keer_om(const string&);

int main() {
  cout << keer_om("Dit is een test") << endl;
  return 0;
}

string keer_om(const string& orig) {
  string result;
  for(string::const_reverse_iterator i= orig.rbegin(); i != orig.rend(); ++i) {
    result+= *i;
  }
  return result;
}

Hier een voorbeeld dat wel de STL maar geen generic functions (std::reverse) gebruikt. (De functie keer_om heeft maar een parameter nl. de constante invoer-string.)

<edit>
Het const keyword is zeer belangrijk in C++. Als je variabelen passed waarvan je weet dat je ze niet wijzigt, declareer je ze als const. Dit is niet alleen goed voor de leesbaarheid, maar ook een hulp voor de compiler die zo meer fouten opsporen kan.
</edit>

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 23:11
Op maandag 18 februari 2002 14:02 schreef mietje het volgende:
code:
1
2
3
#include <iostream>
#include <string>
 [ KNIP ]
:)
Kijk da's nou goede C++ code - geen pointer te zien. Ben weer helemaal happy *D
Het const keyword is zeer belangrijk in C++. Als je variabelen passed waarvan je weet dat je ze niet wijzigt, declareer je ze als const. Dit is niet alleen goed voor de leesbaarheid, maar ook een hulp voor de compiler die zo meer fouten opsporen kan.
Sterker nog, soms is het nodig. Hier bijvoorbeeld, als je
een string literal "..." als argument wil gebruiken. Omdat zoiets een constante is mag je 'm nooit wijzigen. En omdat
een string& gemaakt is om dingen te wijzigen, kan die nooit
naar een "string literal" wijzen. Een string const& kan daar wel naar wijzen.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 13:13
Misschien lees ik de opdracht verkeerd, maar wordt er niet gewoon gevraagd om een (char*) om te keren? Het meegeven van een string-object ("hallo") en dat vervolgens resizen druist m.i. nogal in tegen het principe van OOP. Het lijkt me niet dat dat de bedoeling was.

Wat betreft het omkeren van de string zelf: daar is recentelijk nog een leuk draadje over geweest.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 23:11
Dit lijkt een bug in de string library; de post conditie van basic_string<Ch>::resize( N ) is dat de string N karakters lang is ( overigens wel '\0' karakters -
resize(N,' ')pad met spaties ).

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1