Vstup/vystup C – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Vstup/vystup C – C / C++ – Fórum – Programujte.comVstup/vystup C – C / C++ – Fórum – Programujte.com

 

silent0
Stálý člen
4. 1. 2009   #1
-
0
-

#include <stdio.h>

#include <stdlib.h>
#include <string.h>
int main()
{
char veta[100];

fgets(veta,100,stdin);

fprintf(stdout,"%s",veta);


return 0;


}


chtele bych se zeptat ohledne tohoto kodu slo by to i jinak napsat bez stdin,out ? aby to vzalo celou vetu i v mezerama?

Nahlásit jako SPAM
IP: 90.182.248.–
C#
Earl Cash0
Věrný člen
4. 1. 2009   #2
-
0
-
Nahlásit jako SPAM
IP: 193.85.177.–
Oh my goodness, shut me down! Machines making machines. How perverse. (C-3PO)
silent0
Stálý člen
4. 1. 2009   #3
-
0
-

no prave tohle jsem mel

gets(veta); 

printf("%s", veta);


ale v linux mi to vyhazuje chybu s gets ze nebezpecna funkce atd
ale ne windowsach ve skole se mi zda mi to slo

Nahlásit jako SPAM
IP: 90.182.248.–
C#
KIIV
~ Moderátor
+43
God of flame
4. 1. 2009   #4
-
0
-

To silent : prave ze gets je nebezpecna funkce... co myslis ze se stane kdyz mas promennou pripravenou na 100znaku ale uzivatel zada 20000? a co kdyz se pak prepisou funkce ktere se maji zavolat pri skonceni programu... a co teprve kdyby tam dal vhodny instrukce ktery by treba spustily shell ? ... jako u takovyhodle programu je to asi jeste jedno ale co kdybys takhle vytoril treba neco co ma SUDO... pak by se shell spustil s aktualnima pravama tudiz vlastnika souboru

(todle je jen hodne strucnej vycuc chyby zvane buffer overflow/overrun)

Nahlásit jako SPAM
IP: 80.250.27.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Earl Cash0
Věrný člen
4. 1. 2009   #5
-
0
-

To silent : proto pisu, aby jsi si precetl specifikaci, konkretne toto:

Notice that gets does not behave exactly as fgets does with stdin as argument: First, the ending newline character is not included with gets while with fgets it is. And second, gets does not let you specify a limit on how many characters are to be read, so you must be careful with the size of the array pointed by str to avoid buffer overflows.

jaky problem mas s fci "fgets", ze ji nechces pouzivat?

Nahlásit jako SPAM
IP: 193.85.177.–
Oh my goodness, shut me down! Machines making machines. How perverse. (C-3PO)
silent0
Stálý člen
4. 1. 2009   #6
-
0
-

ja nwm proc ji nepouzivam nejsem zas tak dobry vzdy jsem pouzival standartni a tak jsem videl fgets ale seznamim se s tema funkcema vic

Nahlásit jako SPAM
IP: 90.182.248.–
C#
Mautinek
~ Redaktor
0
Grafoman
2. 2. 2009   #7
-
0
-

A co takhle číst a vypisovat znaku po znaku a detekovat konec souboru pomocí EOF?



int c;

while ((c = getchar()) != EOF && c != '\n')
{
putchar(c);
}

Nahlásit jako SPAM
IP: 213.211.37.–
Programujte.com redaktor
Sleduj mě na @MartinSimko
silent0
Stálý člen
2. 2. 2009   #8
-
0
-

Vyřešeno

Nahlásit jako SPAM
IP: 77.48.206.–
C#
tmi0
Věrný člen
2. 2. 2009   #9
-
0
-

To Earl Cash : proc davas link na specifikaci "gets" a pak se podivujes ze nechce pouzivat "fgets"? nebylo by lepsi mu rovnou ukazat priklad s "fgets" ?

To Mautinek : neni to zbytecne? navic takoveto reseni bude jiste pomalejsi.

jinak bych doporucil jeste funkci getline (tez ze stdio.h), ktera se chova vicemene stejne jako fgets; popr. variantu getdelim - ta ma tu vyhodu ze lze specifikovat jako ukoncovaci znak neco jineho nez '\n' (sice jsem to nikdy nepouzil ale mohlo by se to hodit... )

Nahlásit jako SPAM
IP: 213.226.226.–
ksp.mff.cuni.cz -- doporučuje 5 z 0 přetečených bufferů!
Mautinek
~ Redaktor
0
Grafoman
2. 2. 2009   #10
-
0
-

To tmi : nevím, jestli to bude pomalejší, ale nemusíš u toho definovat žádné pole apod a můžeš takto vypsat teoreticky nekonečně dlouhý vstup, kdybys měl pole musel bys kontrolovat délku vstupního řetězce...

Nahlásit jako SPAM
IP: 213.211.37.–
Programujte.com redaktor
Sleduj mě na @MartinSimko
tmi0
Věrný člen
2. 2. 2009   #11
-
0
-

To Mautinek : vytvoris-li si staticke poleme rekneme velikosti 128b, tak te to vicemene zadny cas nestoji (v porovnani s dobou cteni nekonecneho vstupu:)). pokud budes cist vstup davkove, tedy vzdy po 128 bytech, a tuto davku zpracovavat, tak nemusis kontrolovat zadnou delku vstupniho retezce atd., stejne tak muzes zvladnout teoreticky nekonecny vstup.
a to ze to bude rychlejsi si myslim proto, ze volani 128 funkci, ktere maji za ukol zkopirovat 1B je o neco narocnejsi nez volani 1 funkce co ma kopirovat 128B - minimalne uz jen kvuli rezii funkcniho volani.

konstantu 128 jsem zvolil nahodne, skutecna hodna by se mela odvijet od ocekavane delky vstupu (ale kazdopadne cim vetsi, tim rychlejsi - dokud bude radove mensi nez celkova velikost vstupu)

Nahlásit jako SPAM
IP: 213.226.226.–
ksp.mff.cuni.cz -- doporučuje 5 z 0 přetečených bufferů!
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 111 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý