Citat:
Nedeljko:
Code (c):
char string[15] = "zdravo";
rezerviše (najmanje) 15 bajtova prostora.
A zašto onda ne dopušta da se unese više od 6+1 znak?
evo i malog doprinosa, kod koji radi pod Win - Borland C++ 3.1 for Win (uz komentare, komentare, ... i komentare win vs pingvini).
[code: c]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main()
{
//voditi racuna o velicini stringa
char string1p[15]; // Win: kod prekoracenja, menja vrednost promenljivih koje slede, sem *string ; Linux: ignorise visak
char stringp[15] = "zdravo"; //Win - prihvata ceo unos bez uticaja na ostale prom; Linux - samo max 7 char
char string2p[] = "zdravo"; // prekoracenje zaustavlja izvrsenje programa, max 7 / 6+1 char
//neogranicena velicina
char *string="string"; //isto i za: *string, *string=NULL
//size_t string_size; // Linux: za getline f-ju, ime nebitno, bitno da svaki *string ima svoju "velicinu" //Win ne poznaje
int broj = 888;
printf("\n\nInicijalne vrednosti - bez string1p");
printf("\nString2p: %s",string2p);
printf("\nString: %s",string);
printf("\nBroj: %d",broj);
printf("\n\n Unesi vrednost za string1p - 14char ... L=%d ... ",sizeof(string1p));
scanf("%s",string1p);
printf("\n Rezultat:\n\tString1p: %s\t String2p: %s", string1p, string2p);
//"besmisleni" deo koji treba da prikaze sta se desava kod Win kada se prekoraci velicina za string1p
printf("\n\nVrednosti posle \"prekoracenja\" string1p");
printf("\nString1p: %s \t L=%d",string1p,strlen(string1p));
//ako nema prekoracenja, treba da imaju inicijalne vrednosti
printf("\nString2p: %s",string2p);
printf("\nString: %s",string);
printf("\nBroj: %d",broj);
//*string, string1p[15]
strcat(string,string1p); //radi
printf("\nRezultat - ujedinjenje * []: %s",string );
strcpy(string2p, "ZDRAVO"); //ako napadne string1, da ima normalnu vrednost
printf("\n\nPrvi Broj... %3d",broj); //prekoracenje kod string[n] menja i ovde vrednost
printf("\nUnesi neki broj: ");
scanf("%d",&broj); // brojevi idu ovako
printf("\nBroj... %3d",broj);
//isto to, pokusaj sa string[]
printf("\n\n Unesi vrednost za string1p - 14char ... ");
//Unos: getchar + gets(string) za sve stringove, prvo pojavljivanje gets() iza bilo kog scanf, nije bitno koja promenljiva
getchar();
gets(string1p); //Linux: getline + free za *string; getchar + fgets za string[] - getchar() prethodi samo ako je scanf primenenjeno na ciljnu promenlj.
/* Linux sintaksa:
fgets(string, sizeof(string),stdin); //za string[];
getline(&string, &string_size, stdin); //za *string, inicijalizovan sa NULL ili mu je ta vrednost dodeljena pre getline - OBAVEZNO */
printf("\n Rezultat:\n\tString1p: %s\t String2p: %s", string1p, string2p);
printf("\n\n Unesi vrednost za string - no limitt ... ");
//Unos: gets(string) za sve stringove, naredna pojavljivanja gets() i prvo gets bez scanf ispred
gets(string);
printf("\n Rezultat:\tString: %s", string);
//*string + string1p[] in *string
strcat(string,string1p); //radi. Linux: da bi *string bilo prvo, dodela mora da bude preko getline
printf("\nRezultat: %s",string );
//strcpy dodela
strcpy(string2p,"hello");
printf("\nString2p - strcpy: %s", string2p);
strcpy(string,"string Hello"); //Linux - ne vazi za *string
printf("\nString - strcpy: %s",string);
//dodela - vazi samo za brojeve i *string, ne vazi za string[] -Linux, isto
string = "hello world";
printf("\nString - dodela : %s",string);
//stringp[15] = zdravo
printf("\n\n Unesi vrednost za stringp - 15 or 7 ... ");
gets(stringp);
printf("\n Rezultat:\tStringp: %s", stringp);
printf("\n\n Unesi vrednost za string2p - 7 ... ");
gets(string2p);
printf("\n Rezultat:\tString2p: %s", string2p);
printf("\n\nVrednosti posle prekoracenja string1"); //ne utice na druge promenljive
printf("\nStringp: %s \t L=%d",stringp,strlen(stringp));
printf("\nString2p: %s",string2p);
printf("\nString: %s",string);
printf("\nBroj: %d",broj);
printf("\n\n");
}
[/code]
Napomena: MS Visual C++ 6.0 ne uspeva da izvrši kod (možda je moj kompajler neisravan, a možda je do koda).
ER