Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 23 odgovora
  • 8.720 pregleda

Najnovija ↓

Re: C stringovi, osnove ??? 22.11.2012. u 00:02 · pre 169 meseci #21
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.
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: C stringovi, osnove ??? 22.11.2012. u 22:36 · pre 169 meseci #22
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).
Potpis
ER
Re: C stringovi, osnove ??? 22.11.2012. u 23:52 · pre 169 meseci
izmenjeno 1 put, poslednji put Nedeljko 23.11.2012. u 00:44
  1. Nedeljko23.11.2012. u 00:44zapis iz teksta poruke
#23
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.
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: C stringovi, osnove ??? 23.11.2012. u 01:08 · pre 169 meseci #24
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.
Potpis
ER
Odgovori
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme