C-ben ez hogy tudnám ezt megírni?
Sziasztok! Be kell kérnem tetszőleges számokat, míg nullát nem nyomnak. Ez kódban hogy néz ki?
Azt tudom, hogyha egy számot kérek, akkor:
printf("Adj meg egy számot: \n");
scanf("%d", &szam);
De azt, hogy kezeljem, ha nem tudom előre, hogy hány számot fog beírni az adott egyén?
Fogalmam sincs, hogy ez kódban hogyan is néz ki. :/
Tudnátok segíteni?





do
{
printf("Adj meg egy számot: \n");
scanf("%d", &szam);
} while (szam);





Ha nem kell használnod semmire a bevitt számokat, akkor ennyi:
do{
printf("Adj meg egy számot!");
scanf("%d", &szam);
} while(szam != 0);
Ha használni kell őket (feltételezem, hogy ez inkább a helyzet), akkor csinálsz egy egész-szám tömböt (alaposan fölélőve a használt helyeknek, nem hiszem, hogy lenne az a felhasználó, akinek lenne türelme 100 számot megadni), meg csinálsz egy számlálót:
int szamok[100], szamlalo=0;
do{
printf("Adj meg egy számot!");
scanf("%d", &szamok[szamlalo]);
szamlalo++;
}while(szamok[szamlalo] != 0);
Nem ez az egyetlen helyes megoldás, de ez jutott eszembe hirtelen.
Igen, később matematikai műveletekhez kell őket használnom.
Köszi a megoldást! Erre így magamtól biztos nem jöttem volna rá.





#include <stdio.h>
#define KEZDOERTEK 0
#define INITVAL 1
#define KILEPESIFELTETEL 0
#define ASCIIOFFSET 0x30
int main(void){
char lastchar = INITVAL;
int tmpszam = KEZDOERTEK;
while(1){
lastchar = getch() - ASCIIOFFSET;
if (lastchar != KILEPESIFELTETEL){
if((lastchar > 0) && (lastchar < 10)){
tmpszam = (tmpszam * 10) + lastchar;
}
}else{
break;
}
}
return 0;
}





most nézem az előzőeket, csak az enyém foglalkozik numerikus érvényességvizsgálattal és helyiérték emeléssel.
az előzőekkel az a kis gond, hogy a nulla valójában 0x30, az egy pedig 0x31 és így tovább. Sosem fogsz kilépni a ciklusból, kivéve, ha a terminálnak valahogy beküldöd a 0x0 karaktert, és a scanf tulajdonsága, hogy ettől behülyül.
Húú ezt az utolsót egyáltalán nem értem. :S
Egyébként csak kíváncsiságból. Úgy is meg lehetne oldani, hogy egymás után vesszővel elválasztva beírni? Én ebben gondolkoztam és le is ragadtam itt, ezért nem is jutott eszembe a másik. Mivel az egy dolog, hogy vesszővel elválasztva beírja, de ennyi számot lehet egyáltalán scanf-fel beolvasni, vagy csak egyesével lehet?
#5
De számokat kér és nem karaktereket, ezért int-es megoldást használom.





#define KILEPESIFELTETEL ','
de a ',' helyére beírhatod a 0x2C megfelelőjét is. Voila, így is működik, és már a 0 számjegyet is beveszi a helyiérték emelésbe.
egy kicsit át kellene írni a kódomat, modulárisabbra
Persze, hogy nem érted, ez itt egy hardverközeli nyelv, nem egy visual basic!





Kedves kérdező, akkor arra adj nekem választ, hogy a scanf túlcsordulásait hogyan kezeled le?
Mivel az ASCII tábla jó sok karakterből áll, és a felhasználónak is sok billentyűje van, egy félreütéstől elszáll az egész program. szám helyett beütök neki betűket, funkcióbillentyűt, entert. Vajon miket fog letárolni a scanf?
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!