Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

C stringovi, osnove ???

[es] :: C/C++ programiranje :: C/C++ za početnike :: C stringovi, osnove ???

Strane: 1 2

[ Pregleda: 6472 | Odgovora: 23 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.3gnet.mts.telekom.rs.



+2790 Profil

icon Re: C stringovi, osnove ???21.11.2012. u 23:02 - pre 139 meseci
NULL vrednost nije besmislica, već vrednost sa tačno određenim značenjem, pa ako ne zbuni neku funkciju, nemoj da te to iznenadi.

getchar() stavljaj posle scanf(), a pre fgets().

scanf čita do prve beline (razmak ili tabulator ili kraj reda), a fgets do kraja reda.

Sve što važi za nizove, važi i za stringove, osim što se stringovi mogu osim kao nizovi tretirati i kao stringovi. Kod
Code (c):

char string[15] = "zdravo";
 

rezerviše (najmanje) 15 bajtova prostora.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

EmmaR
Srbija

Član broj: 269847
Poruke: 466



+172 Profil

icon Re: C stringovi, osnove ???22.11.2012. u 21:36 - pre 139 meseci
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
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.3gnet.mts.telekom.rs.



+2790 Profil

icon Re: C stringovi, osnove ???22.11.2012. u 22:52 - pre 139 meseci
Citat:
EmmaR: A zašto onda ne dopušta da se unese više od 6+1 znak?

Ne znam kako si došla do tog zaključka. Ispod si u komentaru napisala da ne radi pod linuksom, ali evo, testiram pod linuksom i radi.
Code (c):

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char hello[100] = "Hello!";
    char hello2[] = "Hello, again!";

    fgets(hello, sizeof(hello), stdin);
    printf("%s%s\n", hello, hello2);

    return 0;
}
 

Uz to, taj stari borlandov prevodilac je jako zastareo. Preporučujem ti Code::Blocks sa kompajlerom koji ide uz njega. Majkrosoft baš i ne poštuje standarde, tako da nemoj da se iznenadiš kada na njihovom prevodiocu neki kod iz knjiga ne radi.

[Ovu poruku je menjao Nedeljko dana 23.11.2012. u 00:44 GMT+1]
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

EmmaR
Srbija

Član broj: 269847
Poruke: 466



+172 Profil

icon Re: C stringovi, osnove ???23.11.2012. u 00:08 - pre 139 meseci
Citat:
Nedeljko: Ne znam kako si došla do tog zaključka. Ispod si u komentaru napisala da ne radi pod linuksom, ali evo, testiram pod linuksom i radi.
Code (c):

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char hello[100] = "Hello!";
    char hello2[] = "Hello, again!";

    fgets(hello, sizeof(hello), stdin);
    printf("%s%s\n", hello, hello2);

    return 0;
}
 

Uz to, taj stari borlandov prevodilac je jako zastareo. Preporučujem ti Code::Blocks sa kompajlerom koji ide uz njega. Majkrosoft baš i ne poštuje standarde, tako da nemoj da se iznenadiš kada na njihovom prevodiocu neki kod iz knjiga ne radi.

[Ovu poruku je menjao Nedeljko dana 23.11.2012. u 00:44 GMT+1]


Stvarno radi. Borland je zaostavština iz perioda DOS+Win3.1/95, u ovoj fazi je OK.
ER
 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: C stringovi, osnove ???

Strane: 1 2

[ Pregleda: 6472 | Odgovora: 23 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.