» »

C problemček

C problemček

pajac ::

Sistem linux (RH 8.0), prevajalnik gcc.
Problem: prevajalnik mi noče prevest naslednjega programa in javi napako (ali opozorilo)!

"the 'gets' function is dangereus and should not be used."

/*--znakovni nizi--*/

#include

int main()
{
char oseba[30];

printf("\nVpisi ime: ");
gets(oseba);

printf("Pozdravljen, ");
puts(oseba);

return 0;
}

Problem je z funkcijama 'gets' in 'puts' 8-O .
Zelo bi bil hvaležen za rešitev problema ali vsaj kakšno drugo možnost, ki bi mi omogočala vnos znakovnega niza in njegov izpis na zaslonu.

Urko ::

namesto funkcije gets uporabi funkcijo scanf namesto funcijo puts pa funkcijo printf
npr: scanf("%s",&oseba) in printf("%s",oseba)

pajac ::

Ja, sam tako lahko vnesem samo en niz, ker se s presledkom vse konča (npr. ime_priimek).

napsy ::

raje uporabi c++ cin.getline() metodo. Čisto preprosto prebereš vrstico.
"If you die, you die. But when you live you live. There is no time to waste."

pajac ::

Ne morem, ker rabim C na faxu in ga zato moram znat. Me zanima, če vam javi prevajalnik kakšno napako, pri uporabi te funkcije.

jlpktnst ::

Ne vidim problema, saj je samo warning (preizkušeno dela), če pa te zelo moti (če pravi kompiler da je nevarno mu je kar za verjet) si najdi alternativo (tega pa ne mene vprašat, moj problem je da po 4 letih prakse še vedno ne obvladam io komand :(
LP

kopernik ::

Pajac:
Ne morem, ker rabim C na faxu in ga zato moram znat.


V C-ju že nekaj časa nisem programiral, ampak tako na hitro ti lahko
povem naslednjo rešitev (ki je mogoče napačna, preizkusi):


main()
{
int ch, i=0;
char vrstica[30];

while((ch = getchar()) != EOF)
{
//nekam si spravi vse zapisane znake
vrstica[i++] = ch;
//ce je konec vrstice
if(ch =='\n')
{
//do something
}
}
}


Ne vzeti zgornje kode kot pravilne! moraš jo preizkusiti

lp

Zgodovina sprememb…

  • spremenil: kopernik ()

noraguta ::

ms cl in pa gcc version 3.2 (mingw) se 0 ne pritozujeta. pozereta tvojo kodo brez bevska in mevska.


drugace pa dodaj:
char ch;
int i;

for(i=0;(ch = getchar()) != '\n'; i++)
{
oseba[i] = ch;
}

BigWhale ::

Komplikatorji... :P

#include

int main()
{

char oseba[30];

printf("\nVpisi ime: ");
fgets(oseba, sizeof(oseba), stdin);
printf("Pozdravljen, %s\n", oseba);
return 0;

}


In za vse tiste, ki so mnenja 'saj je samo warning'... AAAAAA! Kaj ce bi compiler rekel, " makes integer from pointer without a cast" to je tudi samo warning a ne? ;>

Compile w/o warnings and live happily ever after... :)

gets should be banned!

kyoan ::

itak lahko s scanf beres do poljubnega znaka takole:

scanf("[^\n]", &string);

pajac ::

Klapa najlepša hvala, mi je uspelo!!

Če mi še kaj ne bo jasno se znova oglasim.

Lep pozdrav!!:)

demokedes ::

Pozdravljeni,
jest mam tud en manjši c-problemček. In sicer zanima me:
-kaj dela funkcija malloc
-kaj pomeni operator -> A ma to kej veze s strukturami. Če prav razumam s tem operatorjem prideš do elementa znotraj dolpčene strukture.

lp

Rok

OwcA ::

@demokedes: malloc() ti zaseže določen del heapa (spomina) in ti vrne kazalec (void) nanj.

Mislim, da je -> operator le v C++, nisem pa prepričan. V vsakem primeru z njim v enem koraku dereferenciraš kazalec dostopaš do atributov ali metod objekta (struct ali class).


sturct foo
{
int a;
int b;
};

struct foo *pBar = malloc(sizeof(struct foo));
pBar->a = 17;
pBar->b = 42;


P.S. Dopuščam možnost, da kar sem napisal ni čisti C
Otroška radovednost - gonilo napredka.

OwcA ::

@demokedes: prej sem pozabil opozoriti, da moraš zaseden spomin po uporabi ročno sprostiti z free(), nadvse priporočljivo pa je potem še "usmeriti" kazalec na 0;

...
free(pBar);
pBar = 0;
Otroška radovednost - gonilo napredka.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Niti - segmentation fault

Oddelek: Programiranje
211968 (815) galu
»

[C] struct in int[] (strani: 1 2 )

Oddelek: Programiranje
657292 (6365) MrBrdo
»

strcpy reče segmatation fault

Oddelek: Programiranje
101491 (1442) MasterMind
»

C++ vs. C (strani: 1 2 )

Oddelek: Programiranje
766843 (5834) rokpok
»

Pomoč pri c++ razlaga

Oddelek: Programiranje
192300 (2042) Person

Več podobnih tem