Toon posts:

[C] Replace char in wchar[]

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik zit nu al uren te zoeken, maar ik kan geen handige replace functie vinden voor C. (tbv PocketPC console applicatie)
Ik wil alle underscores in een string vervangen door spaties.

Ik heb nu dit:

Aanroep:
code:
1
2
3
4
5
WHCAR pname[MAX_PATH];

[...]

MakeSpaces(pname);


Functie tot nu toe:
code:
1
2
3
4
5
6
7
8
void MakeSpaces(WCHAR *pname)
{
  DWORD  i;
  for (i=0;i<sizeof(pname);i++)
  {
    if (wcscmp(&pname[i],L"_")==0) { wcscpy(&pname[i],L" "); }
  }
}

Ik heb eigenlijk geen idee of ik de pointers e.d. goed heb staan... :?

--edit: hij compiled iig wel goed, maar de underscores worden niet vervangen...

[ Voor 11% gewijzigd door Verwijderd op 19-03-2004 10:32 ]


Verwijderd

Topicstarter
Zijn er al mensen wakker met een beetje C-kennis? O-)

modbreak:
kicken aub pas na 24 uur, iedereen is even belangrijk en komt vanzelf aan de beurt

[ Voor 56% gewijzigd door curry684 op 19-03-2004 14:19 ]


  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 23:53

Reptile209

- gers -

Volgens mij heb je totnogtoe geluk dat het goed gaat (die ban heb je echt verdiend voor kicken na 3 uur :D) maar niet werkt.
Nu loopt je for-lus van 0 tot 4: sizeof(pname) == 4 omdat pname een 4-byte pointer is. Of je de lengte van die array makkelijk kan opvragen, weet ik niet. Misschien iets als wstrlen(), als dat bestaat? Makkelijker is het om iets als dit te gebruiken:
C:
1
2
3
4
5
6
7
8
9
void MakeSpaces(WCHAR *pname)
{
  DWORD  i=0;
  while(pname[i] != '\0')
  {
    if (wcscmp(&pname[i],L"_")==0) { wcscpy(&pname[i],L" "); }
    i++;
  }
}

Dus gewoon je array van element 0 tot aan het einde van je string doorlopen.
Disclaimer: heb al in geen jaren meer C gedaan, en de code is untested. :)

[ Voor 4% gewijzigd door Reptile209 op 19-03-2004 13:32 ]

Zo scherp als een voetbal!


  • Gondor
  • Registratie: September 2003
  • Laatst online: 19:54
Je kan ook strlen() gebruiken ipv sizeof(). Vanuit gaand dat het een terminating char heeft.

"Peace cannot be kept by force. It can only be achieved by understanding"-Albert Einstein-


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
C:
1
2
3
4
wchar_t* wstr;
for( /* begin */ ; *wstr ; ++wstr )
  if( *wstr==L'_' )
    *wst = L' ';

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
  • Nu online
Het probleem is dus dat wcscmp() een string comparison uitvoert. Bedenk dat een string in C een reeks van characters is gevolgd door een afsluitend zero-character. Je invoer ziet er bijvoorbeeld zo uit:
C:
1
char invoer[] = { 'f', 'o', 'o', '_', 'b', 'a', 'r', '\0' };

Waar je ook begint met zoeken, je kunt daar nooit het patroon { '_', '\0' } in vinden, behalve als je string toevallig eindigt op '_'.

Je moet dus niet werken met stringoperaties, maar met karakteroperaties. In dit geval werkt dat uitstekend hoewel het helaas niet eenvoudig uit te breiden is naar een algemene oplossing voor strings van willekeurige lengte en inhoud. De juiste code voor het vervangen van karakters is al gegeven door MSalters.

Overigens gebruikte ik in mij voorbeeld gewone characters, maar dat maakt voor het algoritme verder niet uit.
Gondor schreef op 19 maart 2004 @ 13:45:
Je kan ook strlen() gebruiken ipv sizeof(). Vanuit gaand dat het een terminating char heeft.
Goed gezien; ik had daar zelfs overheen gelezen. Het is hier geen keuze; het moet! Het type van pname is immers WCHAR* en een pointer heeft een vaste grootte (vaak 32 bits, hangt een beetje van je platform/compiler af). De grootte van pchar zegt dus niets over de lengte van de string waar pchar naar verwijst en dat is waar je geïnteresseerd in bent. Met strlen() zou je van een gewone char* de stringlengte op kunnen vragen, maar voor een WCHAR* moet je wcslen() gebruiken.

[ Voor 40% gewijzigd door Soultaker op 19-03-2004 14:18 ]


  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 23:53

Reptile209

- gers -

De fout met sizeof() was overigens wel aan het licht gekomen door tijdens het debuggen door je programma heen te "steppen", of in de lus een printf() op te nemen... tip voor de toekomst dus :)

Zo scherp als een voetbal!

Pagina: 1