Toon posts:

[C++] Hoe string en getal in 1 string gooien?

Pagina: 1
Acties:
  • 102 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik wil een getal en een string aan elkaar zien te plakken. In Visual Basic is dat allemaal makkelijk:
name = "SEG" & i
waarin i een integer is en name een string.

Nu wil ik dit doen in C++, maar ik ben daar niet zo vertrouwd mee, en de MSDN lib werkt niet :( .
Dit is ongeveer de code:

int i;
const char* name;
for (i=0;i<5;i++)
{
name = "SEG" << i;
cout << name << endl;
}
Output moet dus worden: SEG1, SEG2, SEG3....
Het gaat neem ik aan om de uitdrukking tussen "SEG" en i, hoewel ik de bui al een beetje zie hangen dat C++ strenger is en geen integers in een string kan gooien. Hoe moet het wel??

Verwijderd

code:
1
2
3
char string[5] = "SEG";
int getalletje = 2;
seg[3] = (char) getalletje + 48;

Dan is de waarde van de variabele 'string' gelijk aan "SEG2"

Of zit ik zelf mis? :)

  • johnwoo
  • Registratie: Oktober 1999
  • Laatst online: 08-09 14:52

johnwoo

3S-GTE

Op maandag 13 mei 2002 21:26 schreef DiEana het volgende:
code:
1
2
3
char string[5] = "SEG";
int getalletje = 2;
seg[3] = (char) getalletje + 48;

Dan is de waarde van de variabele 'string' gelijk aan "SEG2"

Of zit ik zelf mis? :)
Als je maar oppast met de nullchars ;)
Ik geloof niet dat de laatste twee elementen van jouw array seg met null gepad worden (alleen eentje na het laatste element), dus je zult dan zelf ook ff een nullchar moeten schrijven :)
dus: seg[4] = 0;
Bovendien krijg je problemen als je getallen groter dan 9 wil schrijven... Ik zou toch maar gewoon sprintf gebruiken :)
code:
1
2
3
4
5
6
7
char blaat[8];
int r;

for (r = 0; r <= 5; r++) {
  sprintf(blaat, "SEG%d", r);
  cout << blaat << endl;
}

Als je het toch naar cout gooit kan je natuurlijk net zo goed meteen printf gebruiken :P

4200Wp ZO + 840Wp ZW + 1680Wp NW | 14xIQ7+ + 1xDS3-L | MTVenusE | HWP1


Verwijderd

Op maandag 13 mei 2002 21:58 schreef johnwoo het volgende:

[..]

Als je maar oppast met de nullchars ;)
Ik geloof niet dat de laatste twee elemanten van jouw array seg met null gepad worden (alleen eentje na het laatste element), dus je zult dan zelf ook ff een nullchar moeten schrijven :)
dus: seg[4] = 0;
Bovendien kom je problemen als je getallen groter dan 9 wil schrijven... Ik zou toch maar gewoon sprintf gebruiken :)
OK, vergeten :)

of '\0', voor strings af te sluiten

  • ^Mo^
  • Registratie: Januari 2001
  • Laatst online: 04-11-2025
code:
1
2
3
char Buffer[20]; // Of hoe groot je het ook wilt...
int i = 1;
sprintf( Buffer, "SIG%d", i);

Kan toch ook zo?

- Edit -

aaaargh! Moet eens vroeger naar bed, misschien lukt het me dan om beter te lezen!! :( Mijn excuses voor de dubbelpost, ben nog half aan het :Z

"There are 10 kinds of people in the world, those who understand binary and those who don't" | Werkbak specs


  • johnwoo
  • Registratie: Oktober 1999
  • Laatst online: 08-09 14:52

johnwoo

3S-GTE

Op maandag 13 mei 2002 22:05 schreef _Mo_ het volgende:
code:
1
2
3
char Buffer[20]; // Of hoe groot je het ook wilt...
int i = 1;
sprintf( Buffer, "SIG%d", i);

Kan toch ook zo?
Dat zeg ik, gamma ;)

4200Wp ZO + 840Wp ZW + 1680Wp NW | 14xIQ7+ + 1xDS3-L | MTVenusE | HWP1


Verwijderd

Topicstarter
Thx.
Die string zal lopen van SEG0 tot SEG15 ofzo, dus idd hij zal boven 10 uitkomen. De string wordt daarna als naam van een object opgeslagen, die cout is alleen voor test :) .
Ik ken sprintf niet, zal het eens proberen. Als dat de simpelste oplossing is, is het prima, meer eisen heb ik er niet aan.

Verwijderd

Topicstarter
Welke file moet ik includen om sprintf te gebruiken? iostream doetut niet...

  • johnwoo
  • Registratie: Oktober 1999
  • Laatst online: 08-09 14:52

johnwoo

3S-GTE

Op maandag 13 mei 2002 22:11 schreef Sjoerd het volgende:
Welke file moet ik includen om sprintf te gebruiken? iostream doetut niet...
stdio.h moet je hebben :)

4200Wp ZO + 840Wp ZW + 1680Wp NW | 14xIQ7+ + 1xDS3-L | MTVenusE | HWP1


Verwijderd

Topicstarter
Check! Hij doettut lekker.
Zitter er nog leuke dingen in die h-file, om als newbie te weten?
Ik ben nu in C++ een Flight Management Systeem aan het klussen, die geleidt een 747 langs een geplande route (Die SEGx zijn de Segmenten waarlangs het vliegtuig vliegt, rechte stukken en bochten). Dit is een project van mijn studie, erg leuk! Route zit vol met bochten etc. dus er komt veel gonio bij kijken.
Alles wordt straks in een realtime omgeving aan elkaar geknoopt, mijn module stuurt dan de autopilot aan die daadwerkelijk het vliegtuig moet sturen.

Verwijderd

Met de standard library van C++ zou ik doen:
code:
1
2
3
4
5
6
7
8
#include <iostream>
#include <sstream>

for (int i = 0; i < 5; ++i) {
  stringstream name;
  name << "SEG" << i;
  cout << name.str() << endl;
}

Hoef je geen rekening te houden met grootte ofzo, gaat allemaal automatisch. Met name.str() maak je een string van de stringstream. Werkt alleen niet met verouderde C++ compilers, het is wel volkomen ANSI standaard C++.

edit:
code tags toegevoegd

Verwijderd

Topicstarter
Uiteindelijk gaat de hele zaak op Linux gecompileerd worden, werkt "stdio.h" daar niet op dan? En sstream.h? Versies zijn volgens mij allemaal redelijk nieuw.

Verwijderd

<sstream> is ANSI standard C++, werkt zeker op Linux, iniedergeval met GNU compilers. stdio.h is een oude C-library die ook 100% zeker werkt. Voor C++ is <iostream> een soort vervanging van <stdio.h>, maar uiteraard mag de laatste ook.

[toevoeging:]Zolang je alleen maar dingen uit de standaard gebruikt, zal het op elk systeem werken mits je een fatsoenlijke C++ compiler hebt. Elke fatsoenlijke C++ compiler zal minimaal ANSI standaard C++ ondersteunen. Omdat stringstreams pas sinds enige jaren in de officiele standaard zitten, zullen sommige erg oude compilers het misschien niet ondersteunen, maar mijn programma's die het gebruiken heb ik succesvol op Linux, Solaris, WinXP gecompileerd en gedraaid.[/toevoeging]

Verwijderd

Op maandag 13 mei 2002 23:02 schreef John_Smith het volgende:
Met de standard library van C++ zou ik doen:
code:
1
2
3
4
5
6
7
8
#include <iostream>
#include <sstream>

for (int i = 0; i < 5; ++i) {
  stringstream name;
  name << "SEG" << i;
  cout << name.str() << endl;
}
oei, niet vergeten
using namespace std;

onder de #includes te zetten, anders gaat het bij een goede compiler mis.

Ik denk dat sstream zelf ook string include, maar ik zou hem persoonlijk ook nog even noemen.

Verwijderd

Op maandag 13 mei 2002 23:07 schreef John_Smith het volgende:
<sstream> is ANSI standard C++, werkt zeker op Linux, iniedergeval met GNU compilers. stdio.h is een oude C-library die ook 100% zeker werkt. Voor C++ is <iostream> een soort vervanging van <stdio.h>, maar uiteraard mag de laatste ook.
sstream is de vervanger van stringstream, als je geen sstream hebt moet je even kijken of je die oudere versie nog wel hebt.

ANSI C++? ik dacht dat C++ een ISO standaard was, of is dat hetzelfde?

Als je in C++ werkt kun je beter de C++ versie van de C includes pakken, dat is voor stdio.h dan cstdio (zonder .h), zo werkt het bij de rest ook, c ervoor en .h eraf. Op deze manier worden deze dingen niet meer in de globale namespace maar in de std namespace gedefinieerd.

Helaas pakt GCC standaard de std namespace erbij of iets dergelijks (tenminste met de versies die ik gebruikt heb, 2.96 vooral)

Verwijderd

Op maandag 13 mei 2002 23:08 schreef luite het volgende:

[..]

oei, niet vergeten
using namespace std;

onder de #includes te zetten, anders gaat het bij een goede compiler mis.

Ik denk dat sstream zelf ook string include, maar ik zou hem persoonlijk ook nog even noemen.
Je hebt gelijk, het moet zijn:
code:
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <string>
#include <sstream>
using namespace std;

for (int i = 0; i < 5; ++i) {
  stringstream name;
  name << "SEG" << i;
  cout << name.str() << endl;
}

of als je in een header werkt:
code:
1
2
3
4
5
6
7
8
9
#include <iostream>
#include <string>
#include <sstream>

for (int i = 0; i < 5; ++i) {
  std::stringstream name;
  name << "SEG" << i;
  cout << name.str() << endl;
}

Verwijderd

Op maandag 13 mei 2002 23:12 schreef luite het volgende:

[..]

sstream is de vervanger van stringstream, als je geen sstream hebt moet je even kijken of je die oudere versie nog wel hebt.
Niet helemaal, eerst was er strstream met de header <strstream>, die had echter wat problemen omdat hij met char arrays werkte i.p.v. strings. Nu is er in plaats van strstream, stringstream gekomen. De bijbehorende header is niet <stringstream>, maar <sstream>, beetje verwarrend.
ANSI C++? ik dacht dat C++ een ISO standaard was, of is dat hetzelfde?

Als je in C++ werkt kun je beter de C++ versie van de C includes pakken, dat is voor stdio.h dan cstdio (zonder .h), zo werkt het bij de rest ook, c ervoor en .h eraf. Op deze manier worden deze dingen niet meer in de globale namespace maar in de std namespace gedefinieerd.
klopt, voor oude C-libraries altijd de versie zonder .h en met 'c' ervoor.
Helaas pakt GCC standaard de std namespace erbij of iets dergelijks (tenminste met de versies die ik gebruikt heb, 2.96 vooral)
Niet meer vanaf versie 3. Ik gebruik 3.0nogwat.

Verwijderd

[quote]
Op maandag 13 mei 2002 23:21 schreef John_Smith het volgende:
Niet helemaal, eerst was er strstream met de header <strstream>, die had echter wat problemen omdat hij met char arrays werkte i.p.v. strings. Nu is er in plaats van strstream, stringstream gekomen. De bijbehorende header is niet <stringstream>, maar <sstream>, beetje verwarrend.
Naja, had ik het toch bijna goed ;)
tnx voor de verbetering
Niet meer vanaf versie 3. Ik gebruik 3.0nogwat.
Mooi, ik moet toch nog een nieuwe distro installeren, en dat is dan mooi meegenomen. De laatste tijd ben ik helaas vanwege tijdgebrek weinig meer toegekomen aan c++ werk onder linux.
Pagina: 1