Zdravim. Urovna delam program na tvorbu autorunu. Program delam v jazyce C v konzoli.
No kdyz chci vypisat uzivately nazev souboru ktery chce spustit aby si to zkontroloval tak mi to vypise jenom pocatecni pismeno:
char nazevsouboru;
scanf("%c", &nazevSouboru);
printf("\nsouboru ktery chcete spustit je %c ", nazevSouboru);
No a vzdycky me to vytiskne jenom pocatecni znak. Nevite jak by se dala tato chyba odstranit .
Fórum › C / C++
Jazyk C - Vstup a vystup retezce
duvod proc se operator nedava je prosty: pri volani funkce se jmeno operatoru konvertuje na ukazatel na svuj prvni prvek, tedy na pocatek retezce. coz je v poradku s funkci scanf, ktera pomoci vypustky bere jako parametry adresy promennych na ktere uklada data. ovsem scanf cte pri formatovacim znaku %s znaky az do prvniho ws-znaku, tedy mezery, entru, tabu... to znamena ze pokud by se v ceste vyskytl takovy znak tak se to neprecte cele... a ani uvozovky ti nepomuzou. jak rekl "k", bylo by lepsi uzit funkce getline. a take bych ti doporucoval vic nez 20 znaku, prece jen pro jistotu... obvzlaste kdyby si chtel zadavat cestu pri skvele windousacke organizaci fs do nejake aplikace v "Documents and settings" tak se nechytas
duvod proc se operator nedava je prosty: pri volani funkce se jmeno operatoru konvertuje na ukazatel na svuj prvni prvek...
Mam pocit že k žiadnej konverzii nedochádza. Slovo "nazov" je samo o sebe pointer na prvy prvok v poli nazov[20].
ne to teda neni. myslenka ze pole a ukazatele jsou totez je naprosto bludna. napsanim nazov[20]; vytvaris pole o velikosti 20 polozek typu char, a napsani nazov je stale identifikator pole, jen se v nekterych pripadech konvertuje na ukazatel na svuj prvni prvek. jestli mi neveris nebo si myslis ze na tom nezalezi zkus napsat sizeof(nazov); a uvidis ze to vypise velikost pole jako celku a ne velikost (char *).
Celkom zaujimave. Čital som v knihe že je to pointer na prvy prvok, ale asi išlo o zjednodušenie.
#include <iostream>
using namespace std;
int main()
{
char* pChar, * pC;
char pole[20];
cout << "sizeof(pChar) = " << sizeof(pChar) << endl;
cout << "sizeof(pole) = " << sizeof(pole) << endl;
pChar = new char[20];
cout << "sizeof(pole) = " << sizeof(pChar) << endl;
pChar[10] = 'f';
cout << "pChar[10] = " << pChar[10] << endl;
strcpy(pole, "asdfghjkl");
strcpy(pChar,"yxcvbnmqw");
cout << "pole= " << pole << endl;
for (int i = 0; i < 9;i++)
cout << i << "." << *(pole+i) << endl;
cout << "------\n";
for (int i = 0; i < 9;i++)
cout << i << "." << *(pChar+i) << endl;
system("PAUSE");
return 0;
}
prakticky to neni moc potreba resit, vetsinou se ukazatel a pole chova stejne(parametry funkci... a jedna zajimavost: operator [ ] ma stejnou funkci jako operator dereferencovani *. takze kdyz napises pole[i], prepise se to na *(pole + i), kde se pole konvertuje na ukazatel na svuj prvni prvek. vzhledem k tomu ze scitani je komutativni operace, muzes klidne napsat i[pole] a bude to fungovat!!! ale bude to trochu matouci)) ) . proto i v nekterych knihach toto bludne tvrzeni byva. ale nekdy to muze vest k problemum: napriklad u vicerozmernych poli.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Vstup/vystup C — založil silent
Vstup & výstup — založil wokena
Hlasový vstup / výstup — založil Tomix
Vstup/výstup do souboru v kódování UTF-8 pomocí C++ — založil flukas
Moderátoři diskuze