[C++ & C#] strcat Access Violation & Convert.ToChar

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo,

Ik wil 2 'strings' achter elkaar zetten, dit probeer ik op te lossen door strcat te gebruiken (of denk ik nu te ingewikkeld?).
C++:
1
2
3
4
5
6
    char EndPacket = static_cast<char>( 1 );
    char ThePacket[ 100 ] = "@cBanned";
    char FullPacket[ 1000 ];

    strcat( FullPacket, (char*)ThePacket );
    strcat( FullPacket, (char*)EndPacket );

Alleen bij de eerste strcat krijg ik al een Access Violation |:( Helaas ben ik nog niet zo goed in C++ en ik kan het probleem maar niet vinden..

Verder heb ik nog een tweede vraag. Ik heb deze code in C#:
C#:
1
Convert.ToChar(1)

Hoe kan ik dit het beste in C++ doen? Ik heb nu zoals je hierboven kan zien 'static_cast<char>( 1 );' maar ik denk niet dat dat goed werkt.

Alvast bedankt voor jullie hulp!

Acties:
  • 0 Henk 'm!

  • Icelus
  • Registratie: Januari 2004
  • Niet online
Moet FullPacket niet geïnitialiseerd worden? Strcat probeert nu het einde van de string te bepalen om daarachter de andere string toe te voegen.

Bijv.
C:
1
FullPacket[ 0 ] = '\0';

Developer Accused Of Unreadable Code Refuses To Comment


Acties:
  • 0 Henk 'm!

  • CoolGamer
  • Registratie: Mei 2005
  • Laatst online: 13:41

CoolGamer

What is it? Dragons?

Doordat je de array van FullPacket nog niet ingevuld heeft bevat die willekeurige waarde (of waarschijnlijk in de debugger 0xCC). Hierdoor kan strcat het eind van de string niet vinden, waardoor het doorloopt totdat het ergens een 0 tegen komt of geheugen leest waar hij niet mag lezen.

Mogelijke oplossing is om een waarde in te vullen bij FullPacket
C++:
1
2
3
4
5
6
    char EndPacket = static_cast<char>( 1 );
    char ThePacket[ 100 ] = "@cBanned";
    char FullPacket[ 1000 ] = "";

    strcat( FullPacket, (char*)ThePacket );
    strcat( FullPacket, (char*)EndPacket );


Als je als EndPacket de waarde '1' wilt hebben kan je dat zo doen:
C++:
1
char EndPacket = '1';

¸.·´¯`·.¸.·´¯`·.¸><(((º>¸.·´¯`·.¸><(((º>¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸<º)))><¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Met deze code:
C++:
1
2
3
4
5
6
7
    char EndPacket = static_cast<char>( 1 );
    char ThePacket[ 100 ] = "@cBanned";
    char FullPacket[ 1000 ] = "";

    strcat( FullPacket, (char*)ThePacket );
    printf( "Debug 1" );
    strcat( FullPacket, (char*)EndPacket );

Kom ik nu tot Debug 1, bij de strcat met EndPacket krijg ik nu een AccessViolation:
Unhandled exception at 0x0f85a741 (msvcr100d.dll) in AppName.exe: 0xC0000005: Access violation reading location 0x00000001.
Als ik dit van EndPacket maak:
C++:
1
char EndPacket[ 100 ] = "Test";

Dat werkt wel, maar ik moet daar dus het volgende krijgen:
De bedoeling van die C# code is dat nummer omzet naar een 'teken', dit is een teken als einde van het pakket (dat via sockets verstuurd wordt naar de client). Het probleem is dat ik niet weet hoe ik dat in C++ doe. De bovenstaande code (static_cast<char>( 1 )) had ik gevonden via google. Helaas heb ik dit nog niet kunnen testen omdat hij niet verder dan de strcat komt :X

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Je krijgt een AccessViolation omdat je strcat een pointer naar een enkele char geeft, terwijl die een pointer naar een 0 terminated char array verwacht.

Je zou eventueel wel strncat kunnen gebruiken, die heeft een parameter die aangeeft hoeveel characters je wil kopieren.

[ Voor 28% gewijzigd door Woy op 22-06-2009 14:48 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Woy schreef op maandag 22 juni 2009 @ 14:45:
Je krijgt een AccessViolation omdat je strcat een pointer naar een enkele char geeft, terwijl die een pointer naar een 0 terminated char array verwacht.
Om eerlijk te zijn gaat dit toch wel even boven mijn niveau. Nu snap ik dat het niet goed is om zo maar alles over te nemen, maar ik heb gewoon even geen flauw idee wat ik er mee aan moet.
Zou je willen posten hoe ik dit probleem kan oplossen? Dan kan ik deze post van je ook beter begrijpen waarschijnlijk :)

Oh ik had je edit nog niet gezien, ik zal dat even proberen.
Ook daarmee krijg ik een Access Violation, ik zal het wel fout doen.. Wil je alsjeblieft een voorbeeld posten?

[ Voor 13% gewijzigd door Verwijderd op 22-06-2009 14:54 ]


Acties:
  • 0 Henk 'm!

  • B0rf
  • Registratie: Oktober 2008
  • Laatst online: 03-10-2024
Het is misschien makkelijker om het volgende te doen:

C++:
1
2
3
4
char EndPacket = '\1';
char ThePacket[ 100 ] = "@cBanned";
char FullPacket[ 1000 ];
sprintf(FullPacket, "%s%c", ThePacket, EndPacket);


sprintf is misschien iets complexer als strcat, maar wel zo gemakkelijk, dan kun je er ook eventueel nog andere gegevens bijzetten

[ Voor 10% gewijzigd door B0rf op 22-06-2009 14:56 ]


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op maandag 22 juni 2009 @ 14:51:
[...]

Om eerlijk te zijn gaat dit toch wel even boven mijn niveau. Nu snap ik dat het niet goed is om zo maar alles over te nemen, maar ik heb gewoon even geen flauw idee wat ik er mee aan moet.
Zou je willen posten hoe ik dit probleem kan oplossen? Dan kan ik deze post van je ook beter begrijpen waarschijnlijk :)
Het gaat mis omdat strcat ( en strncat ook, dus mijn opmerking was idd niet correct ) de lengte van de te concateneren string gaat bepalen. Normaal gebeurt dat door alle characters te tellen totdat er een 0 in het geheugen staat.

Nu geef je een pointer naar een enkel character, en je weet dus niet wat er er in het geheugen erna staat. strcat gaat dan gewoon het geheugen doorlopen totdat hij een 0 tegen komt. Maar in dit geval komt hij eerder in een stuk geheugen waar je niet mag lezen ( Dat is de acces violation ).

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 05:18
B0rf schreef op maandag 22 juni 2009 @ 14:56:
Het is misschien makkelijker om het volgende te doen:
C++:
1
2
[..]
sprintf(FullPacket, "%s%c", ThePacket, EndPacket);
Maak er dan gelijk even snprintf van zodat je tegen buffer overflows beschermd bent.

(Ik neem tenminste aan dat de echte code complexer is dan dit voorbeeld, anders kun je natuurlijk wel meteen FullPacket[1000] = "@cBanned\1" schrijven.)

[ Voor 31% gewijzigd door Soultaker op 22-06-2009 15:01 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
B0rf schreef op maandag 22 juni 2009 @ 14:56:
Het is misschien makkelijker om het volgende te doen:

C++:
1
2
3
4
char EndPacket = '\1';
char ThePacket[ 100 ] = "@cBanned";
char FullPacket[ 1000 ];
sprintf(FullPacket, "%s%c", ThePacket, EndPacket);


sprintf is misschien iets complexer als strcat, maar wel zo gemakkelijk, dan kun je er ook eventueel nog andere gegevens bijzetten
Bedankt, hiermee heb ik het werkend gekregen :)

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Maar snap je het nu ook? Want als je niet goed snapt waarom het eerst fout ging, kun je er op wachten dat je binnenkort weer een dergelijk probleem hebt, of nog erger, een exploit in je programma ( Zie daarvoor ook de opmerking van Soultaker )

[ Voor 11% gewijzigd door Woy op 22-06-2009 15:48 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1