Struct - chyba při v kládání – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Struct - chyba při v kládání – C / C++ – Fórum – Programujte.comStruct - chyba při v kládání – C / C++ – Fórum – Programujte.com

 

Apik
~ Anonymní uživatel
29 příspěvků
18. 6. 2009   #1
-
0
-

Zdravím,

začal jsem se učit C++ a došel jsem až ke strukturám a tady jsem se zasekl na chybě, takže budu rád za radu.

Mám strukturu:

struct employees {
char name[20];
int age;
};

employees person;

když vložím věk, tak je všchno v pořádku

person.age = 18;

když ale vložím jméno, hlásí to chybu

person.name = "Robert";

v čem je chyba? Co dělám špatně?

Nahlásit jako SPAM
IP: 213.220.225.–
Quiark0
Věrný člen
18. 6. 2009   #2
-
0
-

To není problém struktury, ale způsobu, jakým se v C/C++ používají řetězce.

Krátká odpověď: použij třídu string, pak to bude fungovat snadno a intuitivně.

Dlouhá odpověď: char name[20] je pole bajtů velikosti 20. Prosté = použít nelze. Musíš těch 20 bajtů prostě překopírovat (funkce memcpy nebo strcpy).

Nahlásit jako SPAM
IP: 193.86.140.–
Apik
~ Anonymní uživatel
29 příspěvků
18. 6. 2009   #3
-
0
-

strcpy mi příjde lepší, nemusím udávat velikost, díky

Nahlásit jako SPAM
IP: 213.220.225.–
KIIV
~ Moderátor
+43
God of flame
18. 6. 2009   #4
-
0
-

To Apik : lepsi je strncpy .. udavat maximalni delku retezce je docela vyhodne z hlediska bezpecnosti

Nahlásit jako SPAM
IP: 77.237.136.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Quiark0
Věrný člen
19. 6. 2009   #5
-
0
-

Takhle, nepoužívat string a hrát si s char *, strcpy apod. je blbost (pokud si nechceš procvičit low-level práci s pamětí).

Nahlásit jako SPAM
IP: 193.86.140.–
KIIV
~ Moderátor
+43
God of flame
19. 6. 2009   #6
-
0
-

To Quiark : neboj low level prace s pameti se mu bude hodit i v C++..

Nahlásit jako SPAM
IP: 77.237.136.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Apik
~ Anonymní uživatel
29 příspěvků
19. 6. 2009   #7
-
0
-

KIIV - jak to může ovlivnit bezpečnost? V čem se může hodit low level práce s pamětí?

Quiark - když říkáš, že je to blbost, tak minimálně to chce důvod + jiné řešení

Nahlásit jako SPAM
IP: 213.220.225.–
Bald3rr0
Super člen
19. 6. 2009   #8
-
0
-

To Apik : V případě, že používáš strcpy() a snažíš se uložit větší počet znaků, než se do pole vejde, program spadne s chybou. Pokud používáš strncpy(), můžeš udat maximální počet znaků, které se uloží do pole. V Případě, že vstupní řetězec bude mít více znaků, než pole, do kterého ukládáš, uloží se pouze počet znaků, který jsi zadal jako 3. parametr ve fci strncpy().

Nahlásit jako SPAM
IP: 82.100.0.–
Quiark0
Věrný člen
19. 6. 2009   #9
-
0
-

Jiné řešení je použít string z STL jak jsem psal.



#include <string>
using namespace std;

...

string name;
name = "Pepa"; // bez problemu


Důvod je ten, že low-level práce s pamětí je dost náchylná na chyby a například na ty bezpečnostní problémy. A v tomto případě se tomu dá vyhnout použitím toho stringu. Ale asi je pravda, že někdy se to člověk naučit musí, jinak potom nebude umět napsat si v C++ třídy, které ho toho ušetří :)

Nahlásit jako SPAM
IP: 193.86.140.–
Apik
~ Anonymní uživatel
29 příspěvků
19. 6. 2009   #10
-
0
-

Díky moc za rady, hned jsem chytřejší:-) a jdu se registrovat

Nahlásit jako SPAM
IP: 213.220.225.–
KIIV
~ Moderátor
+43
God of flame
19. 6. 2009   #11
-
0
-

To Bald3rr : ono program skonci chybou jen pokud zasahuje nekam kam nema.. muze ale sam sebe docela prepsat... je to jeden z docela hodne pouzivanych zpusobu jak se nekam nahakovat... at uz v linuxu nebo ve win ...
samo funguje jen u sluzeb ... pro ziskani vetsich prav (resp cizich prav)

Nahlásit jako SPAM
IP: 77.237.136.–
Program vždy dělá to co naprogramujete, ne to co chcete...
AdamHlavatovic0
Stálý člen
20. 6. 2009   #12
-
0
-

> KIIV - jak to může ovlivnit bezpečnost?
V extremnom pripade moze utocnik skutocnost, ze nekontrolujete pocet znakov vyuzit na tzv. buffer overflow attack, pri ktorom moze dojst az k spusteniu kodu utocnika.

Nahlásit jako SPAM
IP: 94.229.32.–
KIIV
~ Moderátor
+43
God of flame
20. 6. 2009   #13
-
0
-

To AdamHlavatovic : tak tak.. snazi se prepsat uklidove funkce na konci programu a pokud mozno nahodit treba zavolani preruseni pro zobrazeni shellu..

Nahlásit jako SPAM
IP: 77.237.136.–
Program vždy dělá to co naprogramujete, ne to co chcete...
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, 22 hostů

Podobná vlákna

Chyba při kompilaci — založil Ykita

Chyba při stahování — založil Janina

Chyba při stahování — založil Reky

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ý