Programmeertaal C

Status
Niet open voor verdere reacties.

revelian

Gebruiker
Lid geworden
20 mrt 2007
Berichten
81
Hoi,

Heb het volgende programma lopen schrijven, maar er klopt blijkbaar niks van, kan iemand mij uitleggen waarom niet ?

Code:
#include <stdio.h>

main()
{
char s[256];
int i = 0;

printf("input: ");
while(getchar() != '\n'){
s[i++] = getchar();
}
printf(s);
}
 
getchar 2 keer achter elkaar aanroepen en maar één keer opslaan is wat hier gebeurt.

Code:
#include <stdio.h>

main()
{
char s[256];
int i = 0;

printf("input: ");
while( (s[i++] = getchar()) != '\n');
printf(s);
}
 
Hoi,

Heb het volgende programma lopen schrijven, maar er klopt blijkbaar niks van, kan iemand mij uitleggen waarom niet ?

Code:
#include <stdio.h>

main()
{
char s[256];
int i = 0;

printf("input: ");
while(getchar() != '\n'){
s[i++] = getchar();
}
printf(s);
}

En wat nu als de buffer vol is en er is nog steeds geen new line teken voorbij geweest ? Dan valt de volgende index dus buiten het bereik van je buffer...

http://en.wikipedia.org/wiki/Buffer_overflow

edit: ik had dit venster nog open staan en daar stond de reactie van svdww nog niet bij. Maar volgens mij geldt het bovenstaande bericht ook voor de code van sdvww. (er wordt immers niet gecontroleerd of de verhoging van i binnen het bereik van de buffer past, waardoor je dus vanzelf weer buiten het bereik van je buffer zult geraken wanneer er niet tijdig een new line is geweest.)
 
Laatst bewerkt:
edit: ik had dit venster nog open staan en daar stond de reactie van svdww nog niet bij. Maar volgens mij geldt het bovenstaande bericht ook voor de code van sdvww. (er wordt immers niet gecontroleerd of de verhoging van i binnen het bereik van de buffer past, waardoor je dus vanzelf weer buiten het bereik van je buffer zult geraken wanneer er niet tijdig een new line is geweest.)

Hmm ja, daarbij wordt de buffer niet netjes met 0 afgesloten ^^
En ik denk niet dat backspace werkt...

Code:
while( (s[i++] = getchar()) != '\n' && i < sizeof(s)-1 );
s[++i] = 0;

Een minder veilig maar wel backspace-werkende manier:

Code:
gets(s);


Zowel veilig als backspace-werkend:

Code:
memset(s, 0, sizeof(s));
fgets(s, sizeof(s)-1, stdin);
 
Bedankt !

Ben nu wat verder met het programmeren en begrijp dit nu ^^

tnx !


Overigens zou s = '\0'; gewoon moeten werken
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan