Scholieren.com forum

Scholieren.com forum (https://forum.scholieren.com/index.php)
-   Software & Hardware (https://forum.scholieren.com/forumdisplay.php?f=20)
-   -   [Prog] C++: strupr (https://forum.scholieren.com/showthread.php?t=1270813)

Pinchy 21-09-2005 22:29

[C++] strupr
 
Hallo.

Ik heb een über n44b vraag, maar ik kan het werkelijk nergens duidelijk vinden. Ik begin ook maar net met deze zooi, maar goed. Ik moet een bepaalde zin in hoofdletters hebben. Maar ik weet niet hoe dat precies moet. Ik weet wel dat je strupr moet gebruiken. Dit is wat ik heb. Eventjes eenvoudige neergezet:


#include <iostream>
#include <string>
using namespace std;
main()
{
cout << "Deze zin word geheel in hoofdletters afgedrukt." << endl;
return 0;
}


Serieus, ik voel gewoon schaamte nu. Maar ik weet het echt niet. Zou iemand me verder kunnen helpen? Bij voorbaat dank.

Edit: Ik gebruik DevC++ als compiler.

Geschiedenis 21-09-2005 22:39

Nee sorry, dat kan ik niet.

Pinchy 21-09-2005 23:37

#include <iostream>
#include <cstring>
using namespace std;
main()
{
cout << (strupr("Dit is in hoofdletters")) << endl;
return 0;
}




Ik dacht dat dit het zou moeten zijn, maar dan krijg ik de volgende foutmelding:

"Een toegangsovertreding (Segmentatie-fout) is opgestreden in je programma."

Nigo 22-09-2005 00:24

Citaat:

Pinchy schreef op 22-09-2005 @ 00:37 :
#include <iostream>
#include <cstring>
using namespace std;
main()
{
cout << (strupr("Dit is in hoofdletters")) << endl;
return 0;
}




Ik dacht dat dit het zou moeten zijn, maar dan krijg ik de volgende foutmelding:

"Een toegangsovertreding (Segmentatie-fout) is opgestreden in je programma."


Erm, je impliceert met return 0 dat de returntype van de main methode een numerieke danwel boolse waarde is; vermijd ambiguiteit en ook al spreekt het in het geval van main wel voor zich, geef main expliciet een int of bool o.i.d. als returntype. Of haal de return statement gewoon in z'n geheel weg, en gebruik geen (lees:void) als returntype.
Maar zelfs zonder genoemde aanpassing compileert hij hier en draait hij ook, dus vreemd :) Gecompileerd overigens met openwatcom.

Pinchy 22-09-2005 09:28

Citaat:

Ninh schreef op 22-09-2005 @ 01:24 :
Erm, je impliceert met return 0 dat de returntype van de main methode een numerieke danwel boolse waarde is; vermijd ambiguiteit en ook al spreekt het in het geval van main wel voor zich, geef main expliciet een int of bool o.i.d. als returntype. Of haal de return statement gewoon in z'n geheel weg, en gebruik geen (lees:void) als returntype.
Maar zelfs zonder genoemde aanpassing compileert hij hier en draait hij ook, dus vreemd :) Gecompileerd overigens met openwatcom.

Ik heb geprobeerd om openwatcom te gebruiken. Maar ik heb geen idee hoe ik deze moet gebruiken.

Ik kan niet wachten tot in Visual.net heb.

Nigo 22-09-2005 11:48

Citaat:

Pinchy schreef op 22-09-2005 @ 10:28 :
Ik heb geprobeerd om openwatcom te gebruiken. Maar ik heb geen idee hoe ik deze moet gebruiken.

Ik kan niet wachten tot in Visual.net heb.

wcl programma.cpp

kind kan de was doen ;), watcom compiler linker doet de rest voor je.

Pinchy 22-09-2005 14:57

Probleem opgelost. Dit moest het zijn:

#include <iostream>
#include <string>
using namespace std;
main()
{
char zin[30] = "Dit is in hoofdletters";
strupr(zin);
cout << zin << endl;
}

MightyMarcel 22-09-2005 15:08

is ook logisch. (let in deze post ff niet op eventuele syntax fouten, ik heb t niet gecheckt, t gaat om de uitleg.)

in je constructie 'cout << (strupr("blaat")) << endl;

is 'blaat' geen pointer, dus niet benaderbaar voor strupr. (zoiets iig). strupr verwacht een pointer.

(misschien dat je nu zeg 'maar 'zin' is geen pointer : dat istie wel, het is immers de naam van een array. de naam van een array zonder verdere toevoegingen resulteert in het adres van de array.).

waar ik nu eigenlijk benieuwd naar ben : als je dit opsplits dus :

strupr(zin);
cout << zin;

is het resultaat dan nog uppercase (hoofdletters) of niet ? (serieus, ik ben nieuwsgierig maar heb hier ff geen compiler bij de hand.)

dragonstorm 22-09-2005 16:28

no manual entry for strupr :P

ehm, ehm, ehm....

http://www.thinkage.ca/english/gcos/...ib/strupr.html

toch een manual entry, maar toch.
Ik heb geen idee waarom je dit zou gebruiken.

edit:
Citaat:

is 'blaat' geen pointer, dus niet benaderbaar voor strupr. (zoiets iig). strupr verwacht een pointer.
Huh? Last I checked was "Blaat" in C een pointer. (Namelijk naar 'B') Heb moeite voor te stellen dat dit voor C++ niet geld.

Ik denk dat de fout is dat je de return value van strupr naar cout stuurt, terwijl je de de zin in kwestie naar cout wil sturen.

edit nog ein mal:
ik weet niet waar je de hele functie strupr vandaan haalt, maar gcc 3.4.3 herkent 'm iig niet. (En DevCpp gebruikt die). En bovendien istie niet onderdeel van de ANSI standaard.


Prachtige taal, C++ :evil:

GVR 22-09-2005 22:10

Citaat:

Pinchy schreef op 22-09-2005 @ 15:57 :

Probleem opgelost. Dit moest het zijn:

#include <iostream>
#include <string>
using namespace std;
main()
{
char zin[] = "Dit is in hoofdletters";
cout << strupr(zin) << endl;
}

Het probleem is dat je stdupr een pointer naar een constante geeft:

"xxx" -> const char *
char a[]= "xxx" -> char a[4] = {'x','x','x','\0'};

Wat je eerst deed leid tot ongedefinieerd gedrag, vandaar dat het bij watcom wel werkte.

Nigo 22-09-2005 22:36

Citaat:

MightyMarcel schreef op 22-09-2005 @ 16:08 :

strupr(zin);
cout << zin;

is het resultaat dan nog uppercase (hoofdletters) of niet ? (serieus, ik ben nieuwsgierig maar heb hier ff geen compiler bij de hand.)

Het is alweer een tijdje geleden dat ik C heb gedaan, maar volgens mij was strupr niet re-entrant safe; als hetgeen dat je net postte ervoor zorgt dat zin uppercase blijft, kan het niet anders dan dat strupr de pointer zin referenced en vervolgens aanpast.

MightyMarcel 26-09-2005 19:46

Citaat:

dragonstorm schreef op 22-09-2005 @ 17:28 :


Huh? Last I checked was "Blaat" in C een pointer. (Namelijk naar 'B') Heb moeite voor te stellen dat dit voor C++ niet geld.

Ik denk dat de fout is dat je de return value van strupr naar cout stuurt, terwijl je de de zin in kwestie naar cout wil sturen.


niet als 'blaat' gewoon als 'harde tekst' in je code staat lijkt me. (toegegeven, mn C is wat roestig geworden). hoewel je eerste opmerking niet geheel juist is volgens mij, heb je met je tweede opmerking een punt.

c-functies retourneren normaal gesproken niet het resultaat van de functie, vandaar de naam 'functie', lekker logisch. (ik snap de gedachte erachter wel, maar in 9 van de 10 gevallen is snelheid helemaal niet zo belangrijk dat je uberhaupt C zou willen gebruiken.)

inderdaad, mooie taal, C / C++ :evil:

dragonstorm 27-09-2005 10:42

nou ja, in de verdediging van C: ik kan in C wel gewoon 'man strtok' bijvoorbeeld oid intypen, en dan krijg ik de preciese functiebeschrijving :) en hoe je 'm zou moeten gebruiken. Met C++'s fijne non-standard libraries word dat een fijne tik lastiger.

Nee, ik weet zeker dat "Blaat" intern als pointer gerepresenteerd word, (een const char *) want ik doe het vaak :)

Of je zomaar die geheugenruimte mag aanpassen, dat weet ik niet zeker. Ik kopieer altijd de string in mijn functies.

MightyMarcel 27-09-2005 10:47

Citaat:

dragonstorm schreef op 27-09-2005 @ 11:42 :

Of je zomaar die geheugenruimte mag aanpassen, dat weet ik niet zeker. Ik kopieer altijd de string in mijn functies.

mij is altijd uitgelegd dat dat niet kan (niet mag in elk geval, niet kunnen is een groot woord).

GVR 28-09-2005 11:15

Citaat:

MightyMarcel schreef op 27-09-2005 @ 11:47 :
mij is altijd uitgelegd dat dat niet kan (niet mag in elk geval, niet kunnen is een groot woord).
Het is een string literal, en toewijzen hetzelfde als *(&'x')) = 'y'; het gaat niet werken, maar kan niet tijdens compiletime worden gedetecteerd. "XXXX"[2] = 'x' geeft wel duidelijke de fout.

ps. Je hoort er niet van uit te gaan dat het kan.


Alle tijden zijn GMT +1. Het is nu 23:50.

Powered by vBulletin® Version 3.8.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.