Toon posts:

[c] Pointer terugkoppeling

Pagina: 1
Acties:

Verwijderd

Topicstarter
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <ctype.h>

int main(int argc, char *argv[])
{
    char *p;
    p = "In Deze Zin ZiTTen teveel Gare HooFdletters";
    printf("%s\n", p);
    while (*p != '\0')
    {
            //printf is alleen wezig om te testen en die werkt
        printf("%c",tolower(*p));
            //onderstaande regel werkt dus niet

        *p = tolower(*p);

        ++p;
    }
    printf("\nRegel zonder hoofdletters: %s\n", p);
    return 0;
}

Ik wil dus zeg maar een string die een onbekende lengte heeft lowercase maken zodat ik deze later kan gebruiken met strcmp, echter ik krijg de terugkoppeling niet voor elkaar. Ik wil dus de letter die ik lowercase heb gemaakt weer terug zetten in de string van variabele lengte maar op deze manier pikt die het niet :(

  • whoami
  • Registratie: December 2000
  • Laatst online: 15:53
Volgens mij verwacht tolower één enkel character en niet direct de hele string. Je moet dus één enkel item per keer van uw character array aanpassen.

Je kunt ook de lengte van de string gaan bepalen door gebruik te maken van de strlen functie.

Op die manier dus:
code:
1
2
3
4
for (int i = 0; i < strlen(str); i++)
{
  str[i] = tolower(str[i]); 
}

of
code:
1
2
3
4
for (int i = 0; i < strlen(str); i++)
{
  *(str+i) = tolower(*(str+i));
}

Ik hoop dat je het snapt, wat jij probeert te doen is de hele array doorgeven aan die tolower functie. (Waarom doe je dan een loop?). Je moet dus character per charachter gaan omzetten.

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:53
Wat je ook kunt doen om een case-insensitive string-compare te doen is gebruik te maken van de strcmpi() functie.

https://fgheysels.github.io/


Verwijderd

Topicstarter
hmmm in mijn geval was het

strcasecmp(str, const str);

om dus te vergelijken case INsensitive

das voor mij ook al een oplossing, echter
ik ben wel benieuwd hoe ik dat op die lus
die ik boven heb gemaakt op kan lossen

Verwijderd

Omdat je zegt dat je strcasecmp gebruikt, denk ik dat je een soort un*x draait. In windows is het stricmp.

Die string p komt uiteindelijk in een read-only segment te zitten van de uitvoerbare code, en als je in die sectie probeert te schrijven krijg je een segfault.
Een oplossing is eerst een strdup() gebruiken op die constante string ( char *p = strdup("blaaht"); ). Strdup is effectief hetzelfde als een malloc en een strcpy.

Verder geloof ik wel dat je code zal werken.

Maar strings case insensitive vergelijken is een stuk eleganter :P.

  • whoami
  • Registratie: December 2000
  • Laatst online: 15:53
Op maandag 18 februari 2002 20:19 schreef Breez-r het volgende:
das voor mij ook al een oplossing, echter
ik ben wel benieuwd hoe ik dat op die lus
die ik boven heb gemaakt op kan lossen
Zie mijn eerste post.

https://fgheysels.github.io/


  • Sponz
  • Registratie: Juni 2001
  • Niet online

Sponz

nul nest parfait saif moi

Op maandag 18 februari 2002 20:06 schreef Breez-r het volgende:

Ik wil dus de letter die ik lowercase heb gemaakt weer terug zetten in de string van variabele lengte maar op deze manier pikt die het niet :(
Komt omdat je de string constante waar p naar wijst niet mag veranderen.
Gebruik bijvoorbeeld
char s[] = "In Deze Zin ZiTTen teveel Gare HooFdletters";
char *p = s;

ect.


Je hebt gewoon pech dat je programma niet crashed, want dat zou eigenlijk moeten gebeuren.

enne, // is niet de C manier om commentaar neer te zetten :)

  • whoami
  • Registratie: December 2000
  • Laatst online: 15:53
Waarom is p een string-constante?
p is toch een pointer naar die string?

https://fgheysels.github.io/


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 11-09 08:26

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op maandag 18 februari 2002 20:11 schreef whoami het volgende:
Volgens mij verwacht tolower één enkel character en niet direct de hele string. Je moet dus één enkel item per keer van uw character array aanpassen.
hij geeft ook 1 char, namelijk die waar p naar wijst, en niet de hele string :)
Op maandag 18 februari 2002 21:06 schreef Sponz het volgende:

[..]

Komt omdat je de string constante waar p naar wijst niet mag veranderen.
waarom niet? De string staat in een char *, niet in een const char *, niets mis mee dus...

Maar je moet idd zoals sponz zegt gewoon een extra variabele aanmaken die bijhoudt waar p aan het begin naar wijst

dus
code:
1
2
3
4
5
6
7
8
9
char * p, * string;
p = string = "BlaDieblAdieBla";
while (*p != 0)
{
    ...
    ++p;
}

printf ("%s\n", string);

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.


  • Sponz
  • Registratie: Juni 2001
  • Niet online

Sponz

nul nest parfait saif moi

Op maandag 18 februari 2002 22:07 schreef OiSyN het volgende:

[..]

hij geeft ook 1 char, namelijk die waar p naar wijst, en niet de hele string :)
[..]

waarom niet? De string staat in een char *, niet in een const char *, niets mis mee dus...
Toch is het zo...
http://www.eskimo.com/~scs/C-faq/q1.32.html
Ik neem aan dat dat wel klopt, wat daar staat. Maar vaak gaat het goed, en lijkt daarom wel alsof het 'wel kan'.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 11-09 08:26

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op maandag 18 februari 2002 22:26 schreef Sponz het volgende:

[..]

Toch is het zo...
http://www.eskimo.com/~scs/C-faq/q1.32.html
Ik neem aan dat dat wel klopt, wat daar staat. Maar vaak gaat het goed, en lijkt daarom wel alsof het 'wel kan'.
dat is wel wazig, want dan zou een string in quotes dus altijd const char * zijn, waardoor je het niet kunt assignen aan een char *

dit kan tenslotte ook niet zonder warnings/errors
code:
1
2
const char * p1 = "blaat";
char * p2 = p1;      /* error */

disclaimer: ik zeg dus niet dat wat daar staat niet klopt, ik zeg alleen dat het naar mijn idee niet logisch is dat het zo is geregeld :)

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
Mwoah het is wel handig voor self-modifying code! :Y) :P

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 13:13
In tegenstelling tot wat whoami beweerde (no offense), is jou methode in principe correct, alleen moet je (zoals al gezegd is) het begin van de string wel ergens opslaan om 'm uiteindelijk te kunnen printen EN mag je officieel geen constante data wijzigen.

De reden dat de karakterreeks constant is, is dat je een variabele van het type 'char*' declareert. Je declareert dus slechts een pointervariabele. De string zelf ("BlaDieBla") wordt door C als constante data gegenereerd en die mag je dus niet wijzigen (die kan ook gedeeld worden door verschillende pointers).

De oplossing hiervan is dan ook het declareren van een
array variabele, in plaats van slechts een pointer.

Ik denk dat het volgende dus wel zou moeten werken:
code:
1
2
3
char str[]="BlaDieBla", *p=str;
... rest van je code ...
printf("\nRegel zonder hoofdletters: %s\n",str);

Succes!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 11-09 08:26

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op dinsdag 19 februari 2002 00:47 schreef Orphix het volgende:
Mwoah het is wel handig voor self-modifying code! :Y) :P
moet je wel schrijfrechten hebben in je code-segment :)

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.


  • Korben
  • Registratie: Januari 2001
  • Laatst online: 14-11-2025

Korben

() => {};

Op dinsdag 19 februari 2002 01:26 schreef OiSyN het volgende:

[..]

moet je wel schrijfrechten hebben in je code-segment :)
code:
1
leekconvert(quote);

;)

Wat hij bedoelt is dat het stukje code op http://www.eskimo.com/~scs/C-faq/q1.32.html eerst een pointer het adres geeft van een string in het code-segment (eigenlijk data, maar goed), en daarna daarin probeert te schrijven. En da's nie goed.

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?

Pagina: 1