Toon posts:

String functies in C

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik kampt met het probleem dat mijn stukje code het niet goed doet.

Dit is mijn code:

void execute_command (char* in)
{
char *cmd;
char *par1, *par2;
char *del = " \0\n\r";

cmd = strtok (in, del);
par1 = strtok (NULL, del);
par2 = strtok (NULL, del);

if (!strcasecmp (cmd, "user"))
{
}
/* En nog veel meer andere onbelangrijke code */

Deze functie krijgt een string binnen en moet deze opsplitsen in 1-3 andere strings. Gescheiden door een spatie. Het is de bedoeling dat er een bepaald commando herkent wordt.
Krijg je dus zoiets als:
user Dominique
Dan moet de code ervoor zorgen dat in de variabele cmd user komt te staan en in par1 Dominique en moet de code in het if statement uitgevoerd worden. Het probleem is echter dat als je alleen user ingeeft, dan snapt dat ding het niet helemaal.
Als je cmd dan print op het scherm, dan zie je dat er op een of andere manier een enter achter komt die ervoor zorgt dat het if statement een 0 teruggeeft. Dus user met een spatie erachter gaat goed en user zonder spatie gaat fout.

Alvast bedankt voor de mogelijke hulp die jullie mij kunnen bieden.

BTW Ik ben een newbie op C gebied

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03-09 13:30

.oisyn

Moderator Devschuur®

Demotivational Speaker

code:
1
char * del = " \0\n\r";

dat gaat zo niet echt werken; del is nu gelijk aan een string met 1 spatie (" " dus). Dat komt omdat in C strings altijd zero-terminated zijn, dus een \0 character geeft het einde van de string aan
Er staat in del wel data achter, maar daar kijkt de functie strtok verder niet naar, omdat ie die \0 al is tegengekomen. Dus worden de \n en \r ook niet meer als delimiters gezien :)

oplossing: de \0 weghalen (een string kan in C toch al niet met een \0 opgebroken worden omdat dat dus het afsluitingsteken is :))

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.


Verwijderd

Topicstarter
Je hebt gelijk, stom van mij. Toch nog een vraagje daarop: om toch \0 te controleren, moet ik er dan een escape voor zetten dus zoiets \\0

BTW Bedankt voor je hulp

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03-09 13:30

.oisyn

Moderator Devschuur®

Demotivational Speaker

nee, maar controleren op \0 gaat automatisch, omdat strtok (en alle andere string functies) niet verder kijken dan \0

dus als je een string hebt met woorden die zijn gescheiden met een \0, dan krijg je alleen het eerste woord terug, en verder zal ie niet kijken (omdat ie denkt dat ie aan het eind van de string is)

dus controleren op \0 zal sowieso niet nuttig zijn :)

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.


  • Orphix
  • Registratie: Februari 2000
  • Niet online
Op donderdag 30 mei 2002 00:10 schreef .oisyn het volgende:
nee, maar controleren op \0 gaat automatisch, omdat strtok (en alle andere string functies) niet verder kijken dan \0

dus als je een string hebt met woorden die zijn gescheiden met een \0, dan krijg je alleen het eerste woord terug, en verder zal ie niet kijken (omdat ie denkt dat ie aan het eind van de string is)

dus controleren op \0 zal sowieso niet nuttig zijn :)
Misschien dat die het letterlijk bedoelt (dat het einde van de zin eindig in een '\' en '0' dus) ?
Dan moet je idd een extra slash ervoor zetten, dus \\0.

Verwijderd

Je mag overigens ook wel controleren of je input string niet geheel uit whitespace characters bestaat of leeg is...
strtok geeft dan namelijk NULL terug (het gaat hier om de variabele cmd)
En daar can die strcasecmp dus niet tegen...
Gewoon een if (!cmd) { foutmelding/afbreken } structuurtje inbouwen.
Pagina: 1