[C] concateneren van strings

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • jvaneijk
  • Registratie: Mei 2003
  • Laatst online: 29-05 12:10
Ik ben bezig met het concateneren van strings in C. Nu gaat dit via strcat(), is er ook een makkelijke manier zoals die in java of C#
gewoon door middel van + operator
C:
1
2
3
4
std::string str1 = "aap";
std::string str2 = "mies";

std::string test = str1 + " noot " + str2;

Ik zou het erg fijn vinden als dit mogelijk is. zodat ik niet geneste strcat() krijg.

iRacing Profiel


Acties:
  • 0 Henk 'm!

  • Stukfruit
  • Registratie: Oktober 2007
  • Niet online
C++:
1
2
// Simpel :)
std::string test = str1 + std::string(" noot ") + str2;


Ik denk dat je C++ bedoelde ipv C? In die laatste kan je alleen de strxxx-functies gebruiken :)

[ Voor 18% gewijzigd door Stukfruit op 08-04-2008 15:16 ]

Dat zit wel Schnorr.


Acties:
  • 0 Henk 'm!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
Ik volg je even niet. In C is het inderdaad lastig, want daar heb je strcat nodig. In C++ gebruik je net zoals in Java en C# gewoon +. Welke taal gebruik je nu?

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


Acties:
  • 0 Henk 'm!

  • jvaneijk
  • Registratie: Mei 2003
  • Laatst online: 29-05 12:10
Zoals hierboven al aangegevan concateneren van strings in "C". Ik maak dus gebruik van C. Het is dus alleen maar mogelijk om door middel van strcat te werken als ik het goed begrijp?

iRacing Profiel


Acties:
  • 0 Henk 'm!

  • leuk_he
  • Registratie: Augustus 2000
  • Laatst online: 15-07 15:35

leuk_he

1. Controleer de kabel!

strcat nesten? lijkt me niet. snap niet wat je bedoeld

code:
1
2
3
4
5
6
7
char aapnootmies[12];
char * aap="aap";
char * mies="mies";

strcpy(aapnootmies,aap);
strcat(aapnootmies,"noot");
strcat(aapnootmies,mies);


En efficient dat het is! O-)

Moet eigenlijk strncat (of snprintf) gebruiken tegen buffer overflows. In dit voorbeeld is het echter overkill.

[ Voor 31% gewijzigd door leuk_he op 08-04-2008 15:40 ]

Need more data. We want your specs. Ik ben ook maar dom. anders: forum, ff reggen, ff topic maken
En als je een oplossing hebt gevonden laat het ook ujb ff in dit topic horen.


Acties:
  • 0 Henk 'm!

  • Stukfruit
  • Registratie: Oktober 2007
  • Niet online
Waarom probeer je dan std::string te gebruiken?

Dat zit wel Schnorr.


Acties:
  • 0 Henk 'm!

  • RedFox
  • Registratie: November 2001
  • Laatst online: 14:24

RedFox

Heb je een OV ofzo?

Voor dit soort dingen gebruik ik altijd sprintf:
code:
1
2
3
4
5
char test[12];
char * str1 = "aap";
char * str2 = "mies";

sprintf(test, "%s%s%s", str1, "noot", str2);

You are not special. You are not a beautiful or unique snowflake. You're the same decaying organic matter as everything else.


Acties:
  • 0 Henk 'm!

  • unclero
  • Registratie: Juni 2001
  • Laatst online: 08:50

unclero

MB EQA ftw \o/

RedFox schreef op dinsdag 08 april 2008 @ 15:34:
Voor dit soort dingen gebruik ik altijd sprintf:
code:
1
2
3
4
5
char test[12];
char * str1 = "aap";
char * str2 = "mies";

sprintf(test, "%s%s%s", str1, "noot", str2);
Of onder posix systemen is er ook nog asprintf :D
C:
1
2
3
4
char *test;
char *str1 = "aap";
char *str2 = "mies";
asprintf(&test, "%s%s%s", str1, "noot", str2);

Quelle chimère est-ce donc que l'homme? Quelle nouveauté, quel monstre, quel chaos, quel sujet de contradiction, quel prodige!


Acties:
  • 0 Henk 'm!

  • phobosdeimos
  • Registratie: Augustus 2007
  • Laatst online: 14:30
Ik denk dat de TS beter eerst even een beginners boek C++ bij de hand neemt, want hij weet blijkbaar niet in welke taal hij bezig is...

Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
unclero schreef op dinsdag 08 april 2008 @ 16:49:
[...]


Of onder posix systemen is er ook nog asprintf :D
Eigenlijk:
These functions are GNU extensions, not in C or POSIX. They are also available under *BSD. The FreeBSD implementation sets strp to NULL on error.

Acties:
  • 0 Henk 'm!

  • Super_ik
  • Registratie: Maart 2001
  • Laatst online: 14:16

Super_ik

haklust!

Stukfruit schreef op dinsdag 08 april 2008 @ 15:33:
[...]


Waarom probeer je dan std::string te gebruiken?
phobosdeimos schreef op dinsdag 08 april 2008 @ 18:55:
Ik denk dat de TS beter eerst even een beginners boek C++ bij de hand neemt, want hij weet blijkbaar niet in welke taal hij bezig is...
leer 's lezen 8)7 hij wil wat in C++ met + in C doen, en vraag nu hoe.

In C kun je sprintf, asprintf of strcat gebruiken idd

8<------------------------------------------------------------------------------------
Als ik zo door ga haal ik m'n dood niet. | ik hou van goeie muziek


Acties:
  • 0 Henk 'm!

  • phobosdeimos
  • Registratie: Augustus 2007
  • Laatst online: 14:30
Super_ik schreef op dinsdag 08 april 2008 @ 19:21:
[...]


[...]

leer 's lezen 8)7 hij wil wat in C++ met + in C doen, en vraag nu hoe.

In C kun je sprintf, asprintf of strcat gebruiken idd
Waarom blijft hij dan volhouden dat zijn snippet dat hij post C code is?

Acties:
  • 0 Henk 'm!

  • Stukfruit
  • Registratie: Oktober 2007
  • Niet online
Super_ik schreef op dinsdag 08 april 2008 @ 19:21:
leer 's lezen 8)7 hij wil wat in C++ met + in C doen, en vraag nu hoe.

In C kun je sprintf, asprintf of strcat gebruiken idd
Nou nou, wat een vriendelijke reactie zeg. Maar goed, ik vroeg in het begin van dit topic dus dit:
Stukfruit schreef op dinsdag 08 april 2008 @ 15:14:
Ik denk dat je C++ bedoelde ipv C?
Waarop hij reageerde met dit:
De STL is (voor zover ik weet) een (standaard) library voor C++, niet C. Hoeveel is 1 + 1 volgens jou?

Tot dusver brengt mij dit tot de volgende conclusie: meneer wil de STL te gebruiken in een programma dat hij in C wil schrijven _/-\o_

[ Voor 5% gewijzigd door Stukfruit op 08-04-2008 20:50 ]

Dat zit wel Schnorr.


Acties:
  • 0 Henk 'm!

  • phobosdeimos
  • Registratie: Augustus 2007
  • Laatst online: 14:30
Stukfruit schreef op dinsdag 08 april 2008 @ 20:46:
[...]


Nou nou, wat een vriendelijke reactie zeg. Maar goed, ik vroeg in het begin van dit topic dus dit:


[...]


Waarop hij reageerde met dit:


[...]


De STL is (voor zover ik weet) een (standaard) library voor C++, niet C. Hoeveel is 1 + 1 volgens jou?

Tot dusver brengt mij dit tot de volgende conclusie: meneer wil de STL te gebruiken in een programma dat hij in C wil schrijven _/-\o_
Da's dus net dezelfde analyse als ik gemaakt had.
Voor de TS: als je echt in C (C99, C89, whatever, dus GEEN C++, GEEN STL, GEEN STD::STRING) dan moet je je behelpen met basis functies als sprintf(), tenzij je externe 3rd party libs gaat gebruiken (glib ofzo).

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Stukfruit schreef op dinsdag 08 april 2008 @ 20:46:
De STL is (voor zover ik weet) een (standaard) library voor C++, niet C. Hoeveel is 1 + 1 volgens jou?

Tot dusver brengt mij dit tot de volgende conclusie: meneer wil de STL te gebruiken in een programma dat hij in C wil schrijven _/-\o_
Nee, je moet weldegelijk leren lezen (al moet ik toegeven dat het niet superduidelijk is). Hij wil iets doen in C, en om te laten zien wat ie wilt doen geeft ie een C++ voorbeeld. Hij wil geen C++ gebruiken, hij wil weten of het ook zo makkelijk kan als in C++.

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.


Acties:
  • 0 Henk 'm!

  • Stukfruit
  • Registratie: Oktober 2007
  • Niet online
phobosdeimos schreef op dinsdag 08 april 2008 @ 20:52:
Da's dus net dezelfde analyse als ik gemaakt had.
Klopt :)
Daarom de uitgebreide uitleg in m'n vorige post
.oisyn schreef op dinsdag 08 april 2008 @ 21:17:
[...]

Nee, je moet weldegelijk leren lezen (al moet ik toegeven dat het niet superduidelijk is). Hij wil iets doen in C, en om te laten zien wat ie wilt doen geeft ie een C++ voorbeeld. Hij wil geen C++ gebruiken, hij wil weten of het ook zo makkelijk kan als in C++.
:$
Ik zie nu dat je het inderdaad op twee manieren kan lezen ja..

Dat zit wel Schnorr.


Acties:
  • 0 Henk 'm!

  • jvaneijk
  • Registratie: Mei 2003
  • Laatst online: 29-05 12:10
.oisyn schreef op dinsdag 08 april 2008 @ 21:17:
[...]

Nee, je moet weldegelijk leren lezen (al moet ik toegeven dat het niet superduidelijk is). Hij wil iets doen in C, en om te laten zien wat ie wilt doen geeft ie een C++ voorbeeld. Hij wil geen C++ gebruiken, hij wil weten of het ook zo makkelijk kan als in C++.
.oisyn slaat de spijker op zijn kop.
Dat is idd wat ik wil. Het probleem is een beetje lastig. Er wordt gebruik gemaakt van ANSI C nu is er een ander stuk code dat C++ is dit geeft mijn output terug in een std::string formaat. Ik wil dus het liefst niet dmv een for / while loop een char vullen omdat ik nooit precies weet hoe groot mijn string is. Daarom is mijn vraag of er ook zoiets bestaat als een + operator is C die gebruikt kan worden op std::string ook al zijn dat C++ dingen.

Ik weet het, klinkt vreems is omslachtig maar wil niet gebruik gaan maken van strcat() enzo omdat het ong. 5 strings zijn.

iRacing Profiel


Acties:
  • 0 Henk 'm!

  • VyperX
  • Registratie: Juni 2001
  • Laatst online: 14-08 13:04
Het is hierboven al een paar keer gezegd, maar goed:
Er is in C geen ander soort functie beschikbaar voor string concatenatie dan strcat()/strncat().

Dit houdt dus in dat als je strings wil concateneren dat je zelf bij zal moeten houden of je buffer groot genoeg is (en deze zo nodig vergroten). Om een buffer te kunnen vergroten zal je deze zowiezo dynamisch hebben moeten alloceren (malloc()/calloc()), waarna je realloc() kan gebruiken om deze te vergroten.

Als je slim bent maak je met behulp hiervan (en met strncpy()) je eigen string concat functie (welke dus van je buffer 3 dingen moet weten: de locatie, de grootte, en tot hoever de buffer is gevuld).

My Dwarf Fortress ASCII Reward: ~~@~~####,.".D",.B""


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 19:15
Zo zie je maar weer hoe belangrijk goed gebruik van code-tags is: als de topic-starter gewoon [code=c++]..[/code] (of [cpp]..[/cpp]) tags om zijn code heen had gezet, had dat de helft van de discussie gescheeld. ;)

Wat betreft concatenatie van strings met allocatie: C heeft hier geen support voor. Zelf bouwen dus, of de bestaande functies gebruiken. Je zult wel merken dat in C een heleboel dingen die in Java of zelfs in C++ vanzelfsprekend zijn, in C niet direct op dezelfde manier kunnen. Vaak zijn er wel alternatieve manieren om dat op te lossen; als je van plan bent veel in C te programmeren is het waarschijnlijk handig om je de C-stijl van programmeren eigen te maken.

Ook zul je zelf het een en ander moeten schrijven. Als het je vooral om gemak te doen is (en je wat extra geheugenallocaties geen probleem vindt) kun je met een asprintf(..)-achtige constructie veel doen.

Overigens kunnen C++ strings zowel van (met een constructor) als naar (met std::string::cstr()) C-style strings geconverteerd worden, dus dat zou geen probleem moeten zijn. Denk er wel aan dat constructors de inhoud van de string converteren, en de caller eventueel geheugen voor het argument nog zelf moet vrijgeven.

[ Voor 11% gewijzigd door Soultaker op 09-04-2008 13:52 ]

Pagina: 1