Toon posts:

vragen over strings in c

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hoi,

ik ben pas begonnen met c en ik probeer nu alles rond strings een beetje te begrijpen.
nu heb ik nog een paar vragen waar ik zelf niet uitkom

zo wil ik bijvoorbeeld een string kunnen splitsen bij een bepaald teken, dus bijvoorbeeld:
hoi&hallo
en dat hij dan & ziet als scheidingsteken en er dan losse woorden van maakt dus hoi hallo.

ook ben ik benieuwd naar als ik een string heb:
Ik hou van lekkere tomatensoep.

dat ik dan bijvoorbeeld alle e's kan vervangen in een *
dus dan krijg je

Ik hou van l*kk*r* tomat*nso*p

zou iemand mij hier misschien mee kunnen helpen. kom er zelf namelijk niet uit.

Groetjes Teun

Acties:
  • 0 Henk 'm!

  • Radiant
  • Registratie: Juli 2003
  • Niet online

Radiant

Certified MS Bob Administrator

Een string in C is niets anders dan een array van chars met ASCII-waarden dat eindigt met een nul-karakter (\0). Als je alle e's wil vervangen kan je dus gewoon door alle chars in de array heenloopen en vervangen.

Verder zou ik eens hier naar kijken: http://www.cplusplus.com/reference/cstring/

Acties:
  • 0 Henk 'm!

  • Rann
  • Registratie: November 2010
  • Laatst online: 22-09 12:03
Misschien helpt dit je op weg? (geen verstand van c, alleen c#)

2e resultaat op google :P http://stackoverflow.com/...on-to-replace-string-in-c

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21-09 21:47

Creepy

Tactical Espionage Splatterer

Je komt er niet uit? Ok, dat kan. Maar wat heb je dan al zelf geprobeerd om het voor elkaar te krijgen en wat ging daar mis mee?

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
"Wat heb je zelf geprobeerd" is niet helemaal de gepaste reactie voor een concrete vraag met een specifiek antwoord. De string splits functie is strtok( ).

De tweede vraag is wel een kwestie van zelf code schrijven, dus dat mag de TS helemaal zelf gaan proberen.

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


Acties:
  • 0 Henk 'm!

  • Icekiller2k6
  • Registratie: Februari 2005
  • Laatst online: 18:43
Geef eens code die je geschreven hebt? Dan moeten we niet gokken waar het fout gaat.. :)

MT Venus E 5KW (V151) P1 HomeWizard | Hackerspace Brixel te Hasselt (BE) - http://www.brixel.be | 9800X3D, 96GB DDR5 6000MHZ, NVIDIA GEFORCE 4090, ASRock X670E Steel Legend, Seasonic GX1000


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik heb voor het 2e probleem dit, maar het werkt niet

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
   #include<stdio.h>
#include<conio.h>
void strreplace(char *,char,char);
int main()
{
    char s[10],chr,repl_chr;
    printf("\nEnter a string: ");
    scanf("%s", &s);
    printf("\nEnter character to be replaced: ");
    scanf("%s", &chr);
    printf("\nEnter replacement character: ");
    scanf("%s", &repl_chr);
    printf("\nModified string after replacement is: ");
    strreplace(s,chr,repl_chr);
   getch();
   return 0;  
}
void strreplace(char s[], char chr, char repl_chr)
{
     int i=0;
     while(s[i]!='\0')
     {
           if(s[i]==chr)
           {
               s[i]=repl_chr;
           }  
           i++; 
     }
          printf("%s",s);
}

Acties:
  • 0 Henk 'm!

  • Icekiller2k6
  • Registratie: Februari 2005
  • Laatst online: 18:43
hier lijkt het te werken?

MT Venus E 5KW (V151) P1 HomeWizard | Hackerspace Brixel te Hasselt (BE) - http://www.brixel.be | 9800X3D, 96GB DDR5 6000MHZ, NVIDIA GEFORCE 4090, ASRock X670E Steel Legend, Seasonic GX1000


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Wat betekent "werkt niet"? Loopt het vast? Krijg je foutmeldingen? Doet het gewoon niks? Doet het iets anders dan wat je wil? Geef eens wat informatie. ;)
MSalters schreef op maandag 20 oktober 2014 @ 15:31:
"Wat heb je zelf geprobeerd" is niet helemaal de gepaste reactie voor een concrete vraag met een specifiek antwoord. De string splits functie is strtok( ).
Ik zie geen vraag in de TS hoor. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • -hopsa-
  • Registratie: Maart 2012
  • Laatst online: 04-09 16:39
Verwijderd schreef op maandag 20 oktober 2014 @ 15:38:
Ik hou van lekkere tomatensoep.
code:
1
    char s[10]
Dat wordt proppen.

Acties:
  • 0 Henk 'm!

  • Martindo
  • Registratie: November 2010
  • Laatst online: 21-09 21:07
Als ik naar je code kijk, zie ik geen problemen. Lijkt op werkende code.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
als ik bijvoorbeeld: hoi ik ben kees invul dan krijg ik foutmeldingen over corrupte variablen

Acties:
  • 0 Henk 'm!

  • DataGhost
  • Registratie: Augustus 2003
  • Laatst online: 22-09 17:24

DataGhost

iPL dev

Dat klopt, zie het bericht van -hopsa-. Daarnaast lees je strings in enkele chars, dat zou zo uit m'n hoofd leuke side-effects moeten of kunnen geven.

Acties:
  • 0 Henk 'm!

  • Martindo
  • Registratie: November 2010
  • Laatst online: 21-09 21:07
@soepblikje: Je initialiseert een character array van tien karakters, als je er dan meer in probeert te stoppen, ga je over de grenzen van je character array heen en dan krijg je inderdaad foutmeldingen.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik heb nu char s[10] naar char s[64] veranderd maar krijg nog steeds dezelfde fouten

Acties:
  • 0 Henk 'm!

  • DataGhost
  • Registratie: Augustus 2003
  • Laatst online: 22-09 17:24

DataGhost

iPL dev

Nee, je krijgt nu toevallig foutmeldingen omdat je stack smashing protection aanstaat en die ziet dat je canary overschreven is. Afhankelijk van hoeveel teveel er in zo'n array gestopt wordt zal je programma andere dingen gaan doen dan dat het zou moeten doen of zelfs helemaal crashen.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
dit heb ik ook al toegevoegd:

#define _CRT_SECURE_NO_WARNINGS

Acties:
  • 0 Henk 'm!

  • DataGhost
  • Registratie: Augustus 2003
  • Laatst online: 22-09 17:24

DataGhost

iPL dev

Als je weet dat iets fout is, los je doorgaans het probleem op in plaats van je ogen dicht te doen, vingers in je oren te stoppen en een liedje te zingen. Je moet ervoor zorgen dat er niet teveel buiten je variabelen (allemaal! zie m'n eerdere post) geschreven kan worden.

Acties:
  • 0 Henk 'm!

  • Martindo
  • Registratie: November 2010
  • Laatst online: 21-09 21:07
Ik zou uitkijken met het blokkeren van warnings, je hebt nu dat compilers en ide's meestal jou tegen bad memory access beschermen maar doorgaans is dat niet het geval.

Wat een slimmere oplossing zou zijn, is om het aantal in te voeren karakters te limiteren. C heeft er een standaard functie voor, hoe die precies heet weet ik niet zo snel.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
@DataGhost.

ik loop een beetje vast en snap ook niet helemaal wat je bedoeld. zou je het probleem van het programmaatje even anders kunnen omschrijven, alvast bedankt:)

Acties:
  • 0 Henk 'm!

  • Martindo
  • Registratie: November 2010
  • Laatst online: 21-09 21:07
Wat DataGhost probeert te zeggen, is dat je met die macro definitie het probleem niet zo zeer oplost, maar juist negeert. Dit is exact iets wat je jezelf niet moet aanleren.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik heb trouwens even voor de test, nadat ik mijn zin heb ingevuld een printf van die zin gedaan.
en wat ik dus krijg is dat alleen het 1e woord wordt weergegeven.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
wat ik nu heb en dat werkt is dit, maar krijg nog steeds een foutmelding aan het einde

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<conio.h>

void strreplace(char sentence[1024], char chr, char repl_chr)
{
    int i = 0;
    while (sentence[i] != '\0')
    {
        if (sentence[i] == chr)
        {
            sentence[i] = repl_chr;
        }
        i++;
    }
    printf("%s", sentence);
}

int main()
{
    char chr, repl_chr;
    char sentence[1024];

    printf("\nEnter a string: ");
    scanf("%[^\n]s", &sentence);
    printf("The given sentence is   : %s", sentence);
    printf("\nEnter character to be replaced: ");
    scanf("%s", &chr);
    printf("\nEnter replacement character: ");
    scanf("%s", &repl_chr);
    printf("\nModified string after replacement is: ");
    strreplace(sentence, chr, repl_chr);
    getchar();
    return 0;
}


deze foutmelding:
Run-Time Check Failure #2 - Stack around the variable 'repl_chr' was corrupted.

[ Voor 5% gewijzigd door Verwijderd op 20-10-2014 17:30 ]


Acties:
  • 0 Henk 'm!

  • Icekiller2k6
  • Registratie: Februari 2005
  • Laatst online: 18:43
think about this char = 1 teken string is meerdere.... *cough \0 cough*

der zijn FYI 2 manieren om dit op te lossen depending on your flavour of poison.

[ Voor 51% gewijzigd door Icekiller2k6 op 20-10-2014 17:34 ]

MT Venus E 5KW (V151) P1 HomeWizard | Hackerspace Brixel te Hasselt (BE) - http://www.brixel.be | 9800X3D, 96GB DDR5 6000MHZ, NVIDIA GEFORCE 4090, ASRock X670E Steel Legend, Seasonic GX1000


Acties:
  • 0 Henk 'm!

  • Martindo
  • Registratie: November 2010
  • Laatst online: 21-09 21:07
Op welke regel krijg je deze foutmelding?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
staat geen regel bij, krijg ik gewoon nadat ik de replacement character heb ingevuld

Acties:
  • 0 Henk 'm!

  • Icekiller2k6
  • Registratie: Februari 2005
  • Laatst online: 18:43
Denk eens even na... je hebt een char (1 teken) of een string dat eindigt met een \0 door je enter...
Als je het niet zeker bent check je scanf eens van je replace char na input.

[ Voor 27% gewijzigd door Icekiller2k6 op 20-10-2014 17:38 ]

MT Venus E 5KW (V151) P1 HomeWizard | Hackerspace Brixel te Hasselt (BE) - http://www.brixel.be | 9800X3D, 96GB DDR5 6000MHZ, NVIDIA GEFORCE 4090, ASRock X670E Steel Legend, Seasonic GX1000


Acties:
  • 0 Henk 'm!

  • thof
  • Registratie: Oktober 2008
  • Laatst online: 19:17

thof

FP ProMod
code:
1
while (sentence[i] != '\0')


Wat nou als er geen '\0' in zit? :9

Server 1: Intel N305 | 48GB RAM | 5*4TB NVME | 4x 2.5GbE
Server 2: Intel N5105 | 64GB RAM | 1TB NVME | 4x 2.5GbE
Server 3: Intel Xeon E5-2670 | 128GB RAM | 512+750GB SATA SSD | 6x10TB HDD | 6x 1GbE [Buiten gebruik]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-09 16:37

.oisyn

Moderator Devschuur®

Demotivational Speaker

Dan voldoet de string niet aan de norm. Niet echt iets om rekening mee te hoeven houden.

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.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
uhhhh sorry ik weet echt niet wat ik moet doen.... ben nog niet heel lang met c bezig

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-09 16:37

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik zie twee keer een scanf("%s") die dus een string wil lezen, maar je geeft het adres op van een enkel karakter. Dat gaat dus nooit passen, tenzij de gebruiker direct op enter drukt (waardoor alleen de trailing '\0' wordt opgeslagen - precies 1 karakter dus)

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.


Acties:
  • 0 Henk 'm!

  • Martindo
  • Registratie: November 2010
  • Laatst online: 21-09 21:07
Even aan de topicstarter, ga eens kijken naar de functie fgets ;). Dit is een veiligere functie voor het krijgen van c strings

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 23:05
.oisyn schreef op maandag 20 oktober 2014 @ 18:07:
Ik zie twee keer een scanf("%s") die dus een string wil lezen, maar je geeft het adres op van een enkel karakter. Dat gaat dus nooit passen, tenzij de gebruiker direct op enter drukt (waardoor alleen de trailing '\0' wordt opgeslagen - precies 1 karakter dus)
Misschien mierenneuken, maar als je op enter drukt dan gebeurt er nog niets, want scanf() skipt whitespace voor %s. ;)

Sterker nog, het is onmogelijk om een lege string in the lezen met scanf("%s"). (Geen match kan wel; dan staat er rommel in.)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
maar als ik scanf("%c", &chr); doe, dan wordt hij helemaal geskipt

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 23:05
Nope, dan lees je de newline character van de vorige regel, want voor %c wordt géén whitespace geskipt. Dan kun je beter iets als scanf(" %c", &c); doen. Let op de spatie voor %c: die zorgt ervoor dat whitespace gematcht wordt (niet per se een spatie).

Maar Martindo heeft gelijk: je kunt beter fgets() gebruiken en regel-voor-regel invoer inlezen. Dan kun je tenminste ook meerdere woorden op een regel zetten (zoals je in de TS ook als voorbeeld gaf). scanf() is vooral nuttig voor het lezen van data in een vast formaat; niet zozeer voor interactie met een gebruiker.

[ Voor 40% gewijzigd door Soultaker op 20-10-2014 18:47 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
bedankt Soultaker, dat was de oplossing. helemaal geen foutmeldingen meer. ik heb dus die laatste 2 scanf's de %s vervangen door " %c" en dat werkte. !! probleem 1 is dus opgelost

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
mijn andere vraag was eigenlijk dit:

vul je naam en leeftijd in (naam/leeftijd):
input: henk/89
en dat die input dan gelezen wordt als:
naam: henk
leeftijd: 89

hoe moet ik hier aan beginnen?
want heb al geprobeerd met
scanf(%s/%s) maar dat werkt dus niet.

hij moet eigenlijk zo lezen dat die / als een afbraak streep wordt gezien, maar ik weet niet hoe

[ Voor 37% gewijzigd door Verwijderd op 20-10-2014 18:52 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Ik zou eens beginnen met je eigen topic daadwerkelijk lezen want daar heeft MSalters in "vragen over strings in c" allang antwoord op gegeven. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
haha sorry helemaal vergeten:p

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 23:05
En als je snapt wat strtok() doet, lees dan gelijk even verder over strtok_r(). ;)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik kan eigenlijk niet veel vinden over strtok_r()

maar ik snap strtok() nu alleen dan heb ik dus 2 gesplitste woorden dus bijvoorbeeld
merk/type
input: audi/A3
output:
audi
A3

maar stel dat ik nu het type in een andere zin wil verwerken en die moet ik dus uit die lijst halen. hoe kan ik die dan opvragen?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Er is geen lijst, want strtok en strtok_r geven geen lijst terug. Lees gewoon even wat documentatie door en probeer te begrijpen wat het doet. Als wij steeds voor moeten kauwen wat jij moet copy/pasten om werkende code te krijgen leer je niet veel.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ja maar ik heb de code zo gemaakt en dan krijg ik wel een lijst:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

int main()
{
char sentence[1024];
char *p;
printf("\nName/studentid: ");
scanf("%[^\n]s", &sentence);
printf("String \"%s\" is split\n", sentence);
p = strtok(sentence, "/");
while (p != NULL)
{
printf("%s\n", p);
p = strtok(NULL, "/");
}
return 0;
}

maar ik ga nu ff die laatste documentatie lezen die je hent gestuurd;)

Acties:
  • 0 Henk 'm!

  • Martindo
  • Registratie: November 2010
  • Laatst online: 21-09 21:07
Wat NMe zegt. Waarschijnlijk denk je dat je een lijst krijgt en krijg je deze helemaal niet.

[ Voor 151% gewijzigd door Martindo op 20-10-2014 22:47 ]


Acties:
  • 0 Henk 'm!

  • mbaltus
  • Registratie: Augustus 2004
  • Laatst online: 22-09 13:49
[quote]Verwijderd schreef op maandag 20 oktober 2014 @ 17:28:
[code=c]
...
while (sentence[i] != '\0')
...
[/code]
[/quote]

Het is lang geleden dat ik C geprogrammeerd heb, maar is dit niet ook al een mogelijke bug. Stel dat er om wat voor reden toch geen "\0" is opgenomen in de char array, dan ga je hier uit je geheugen kunnen lopen. Dus moet er een tweede test bij, toch?:
[code=c]
...
while ((i < 1024) && (sentence[i] != '\0'))
...
[/code]

oeps, te snel gereageerd. was al benoemd en afgeschoten

[ Voor 6% gewijzigd door mbaltus op 21-10-2014 09:17 ]

The trouble with doing something right the first time is that nobody appreciates how difficult it is


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Verwijderd schreef op maandag 20 oktober 2014 @ 22:37:
ja maar ik heb de code zo gemaakt en dan krijg ik wel een lijst
Nee, zo krijg je geen lijst. Zo druk je een lijst af. Die lijst heb je alleen op je scherm staan, niet in je geheugen.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1