Nativ C-ben miért nem tudom elmenteni a stringet?
Lenne egy állítás
pl:
char log[100];
if(a<b)
log="A";
Tehát ha igaz az állítás, akkor a string vagy karaktertömb legyen egyenlő egy szöveggel.
Tudom, hogy a fenti hibás, de mivel nem tudom a megoldást, így ez egyértelmű.
Illetve ezt szeretném ismételni.
Tehát az lenne a cél, hogy van 10 állítás, és a hibaüzeneteket begyűjtöm egy log fájlba.
Ennyi hiányzik már csak.
Kérlek segítsetek.
Ahh, mér nem lehet itt editálni... mind1:
szóval
char errors[120];
strcpy(errors, "Errors:\n");
if(a<b){
strcat(errors, "invalid numbers\n");
}
printf("%s", errors);
Amúgy az zavart be, már leírom, hogy nekem rémlik, hogy kellett olyan függvényt is csinálni, ami azt tudja, hogy 120 karakteres tömmbe teszek egy 20 karakteres szöveget.
Mert valahogy nekem nem ment az se.
Tehát vonyított a rendszer, ha egy 120-asba akartam tenni az error szót.
"Amúgy az zavart be, már leírom, hogy nekem rémlik, hogy kellett olyan függvényt is csinálni, ami azt tudja, hogy 120 karakteres tömmbe teszek egy 20 karakteres szöveget.
Mert valahogy nekem nem ment az se.
Tehát vonyított a rendszer, ha egy 120-asba akartam tenni az error szót."
A szöveget lezáró 0-ás karaktert is átmásoltad?
Azt hogyan kell?
Egyébként most megint nem jó, tehét a próba működött, a főprogramban is addig, amíg nincs több hibaüzenet.
Mindig felülírja.
Dehogy írja felül.
Én írtam el.
most már tényleg jó.
Viszont ez a nullás karakter érdekel még mindig:)
A C-ben (is) a string egy karakter tömb. A tömb viszont a program szempontjából nem más, mint egy pointer, tehát az első karakter címe. Alap esetben ebből nem derül ki, hány elemű a tömb (illetve attól függ), az meg pláne nem derül ki, hogy azon belül milyen hosszú a sztringed.
Ezért a sztring végét egy nulla karakter jelzi. Tehát a "hello" szöveg így néz ki tömbként egy 10 elemű tömbben:
['h','e','l','l','o','\0',?,?,?,?]
A kérdőjelek helyén bármi lehet, akár memóriaszemét is. Viszont a sztringeket használó függvények csak a nulla karakterig fogják olvasni.
Amikor szöveget másolsz egy memóriaterületre (pl. tömbbe), akkor a végére a nullának is oda kell kerülnie. Ezt némelyik függvény odateszi, némelyik nem, és olyankor neked kell. Hogy melyik hogy működik, annak érdemes előtte utánanézni.
char * strcpy ( char * destination, const char * source );
"Copies the C string pointed by source into the array pointed by destination, including the terminating null character (and stopping at that point)."
Vagyis sztringet másol a source által mutatott címről a dest. által mutatott címre addig, amíg a source-nél null karakterhez nem ér. Azt még átmásolja, utána megáll.
void * memcpy ( void * destination, const void * source, size_t num );
"..The function does not check for any terminating null character in source.."
Ez nem foglalkozik a lezáró karakterrel. (Merthogy nem konkrétan sztring kezelő függvény.)
char * strcat ( char * destination, const char * source );
"Appends a copy of the source string to the destination string. The terminating null character in destination is overwritten by the first character of source, and a null-character is included at the end of the new string formed by the concatenation of both in destination."
Nem akarom túltagozni, a lényeg a sztringet lezáró null karakter (terminating null character). Az ilyen sztringeket úgy is szokták mondani, hogy "null terminated string", nulla karakterrel lezárt sztring.
A lezáró null karakter miatt van, hogy amikor megadod a tömb (vagy valahogy lefoglalt memóriaterület) méretét egy sztringnek, akkor legalább eggyel nagyobb méretet kell megadni, mint a szöveg hossza. (Mármint sima egy bájtos ASCII karakterek esetén.) Ha ezt elfelejted, az csúnya hibákhoz vezet.
char * str; // <-- pointer a későbbi sztringhez
str = (char*) malloc( 4 ); // <-- helyfoglalás 3+1 karakterhez az "ABC" sztringnek
//----
strcpy( str, "ABC" ); // <-- sztring értékadás, ez odateszi a nullát is
//----
// vagy így is csinálhatod az értékadást, csak akkor neked kell odatenni a nullát:
str[0] = 'A';
str[1] = 'B';
str[2] = 'C';
str[3] = '\0';
//----
...
free(str);
log="A";
Vigyázat, a C-ben nincsenek a máshol megszokott sztringek, csak "null-terminated" karakter tömbök. Egy tömbre pedig pointerrel mutatunk. Ugyanígy a sztring literálok (idézőjeles szövegek) mögött is valójában pointerek vannak. A fenti sor éppenséggel helyes lehet, csak nem azt csinálja, amire gondolsz. Nem másol szöveget, csak a log pointerbe másolja az "A" (['A','\0']) sztring címét, vagyis elállítja (ha a fordító engedi) a log pointert, ami itt azért gáz, mert a log végig a stack-en lefoglalt eredeti tömbre kell mutasson.
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!