Počet medzier na jeden tabulátor – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Počet medzier na jeden tabulátor – C / C++ – Fórum – Programujte.comPočet medzier na jeden tabulátor – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
Tango0
Newbie
29. 12. 2013   #1
-
0
-

Čuste.
Snažím sa odfiltrovať z vstupu tabulátor a nahradiť ho medzerami.
Ide o ANSI C99.
Problém je v tom, že neviem kolkými medzerami ho mám nahradiť. 
Niekedy keď stlačím tabulátor spraví to medzeru o 8 znakoch, niekedy 4 a niekedy zas 6.
Čo s tým? Ako zistím tú velkosť? Alebo aspoň vysvetlenie?

Nahlásit jako SPAM
IP: 195.91.7.–
JoDiK
~ Anonymní uživatel
987 příspěvků
29. 12. 2013   #2
-
0
-

#1 Tango

Niekedy keď stlačím tabulátor spraví to medzeru o 8 znakoch, niekedy 4 a niekedy zas 6.

To přece záleží na programu (editoru), jak tabulátor vyhodnotí...

Vyšší textové editory navíc tabulátor nenahrazují, ale nechají ho tak...

Takže si nejdřív ujasni, co vlastně chceš dělat a pak řeš co čím nahrazovat...

Nahlásit jako SPAM
IP: 88.100.43.–
JoDiK
~ Anonymní uživatel
987 příspěvků
29. 12. 2013   #3
-
0
-

#1 Tango
Programátorské editory většinou vkládají místo tabulátoru tolik mezer, kolik je potřeba na posun na začátek dalšího slova/bloku podle předcházejícího řádku...

Nahlásit jako SPAM
IP: 88.100.43.–
Tango0
Newbie
29. 12. 2013   #4
-
0
-

Tak opakujem, chcem z getchar vymeniť '\t' pomocou viacerých medzier.
Tu nejde o žiadny textový editor.
Keď píšem riadky v skompilovanom programe, tak po stlačení tabulátora ma povedzme presunie o štyri medzery (opticky)..
V ďalšom riadku ma už ale môže posunúť o 8.

Nahlásit jako SPAM
IP: 195.91.7.–
Tango0
Newbie
29. 12. 2013   #5
-
0
-

Napríklad, keby som chcel použiť tento kód

if ((c = getchar()) == '\t')
    for (i = 0; i < 4; i++)
        putchar(' ');

tak by mi nefungoval, pretože niekedy keď stlačím tabulátor tak ten tabulátor proporčne zaberie viac miesta.

Nahlásit jako SPAM
IP: 195.91.7.–
Kit+15
Guru
29. 12. 2013   #6
-
0
-

#5 Tango
Standardně má tabulátor 8 mezer.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Tango0
Newbie
29. 12. 2013   #7
-
0
-

Skúšal som, ako to funguje a zistil som, že úplne ináč :).
Keď stlačím tabulátor, neposunie ma o 8, alebo tak, ale na pozíciu na ktorej v predošlom riadku nie je prázdny znak.
(nie v prostredí, ale aj vo výslednom programe)

Nahlásit jako SPAM
IP: 195.91.7.–
Kit+15
Guru
29. 12. 2013   #8
-
0
-

#7 Tango
Tady nedostaneš rozumnou odpověď, dokud nenapíšeš, k čemu to vlastně potřebuješ. Tabulátor může mít mnoho významů od zanedbatelného bílého znaku až po nedílnou součást syntaxe některých jazyků. Pokud ho chceš jen nahradit posloupností mezer, klidně si definuj svá vlastní pravidla.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
JoDiK
~ Anonymní uživatel
987 příspěvků
29. 12. 2013   #9
-
0
-

#7 Tango

Keď stlačím tabulátor, neposunie ma o 8, alebo tak, ale na pozíciu na ktorej v predošlom riadku nie je prázdny znak.

Nepsal jsem náhodou prakticky totéž?

Programátorské editory většinou vkládají místo tabulátoru tolik mezer, kolik je potřeba na posun na začátek dalšího slova/bloku podle předcházejícího řádku...

Nevidím ti na obrazovku, na čem zrovna děláš ani jak si představuješ, že to má fungovat...  Z toho, cos tu popsal se to poznat nedá... Ale pokud se to má chovat jako programátorský editor, tak už sis vlastně odpověděl sám...

Nahlásit jako SPAM
IP: 88.103.233.–
Kit+15
Guru
30. 12. 2013   #10
-
0
-

#3 JoDiK
Programátorské editory většinou vkládají místo tabulátoru tolik mezer, kolik je potřeba na posun na začátek dalšího slova/bloku podle předcházejícího řádku...

Takové chování by se mi moc nelíbilo. Zvykl jsem si na odskakování po každé 4. pozici. Výhodou je, že pokud se tabulátor používá systematicky, každému z nás se ten zdroják zobrazí podle jeho pravidel. Nechápu pravidlo, že se tabulátor má nahrazovat mezerami, ale když to někdo potřebuje, tak mu tam ty mezery dám.

Při psaní programu se však formátováním a zalamováním nezabývám, vše nechávám na editoru.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Kit+15
Guru
30. 12. 2013   #11
-
0
-

#1 Tango
Zkus program Astyle.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Tango0
Newbie
30. 12. 2013   #12
-
0
-

Nepochopili ste ma..
Skúsim ešte raz vysvetlenie zahŕňajúc príklad.
Výsledná konzolová aplikácia vytvorená v CodeBlocks editori po stlačení TAB ('\t') reaguje tak, že opticky nedáva tabulátoru vždy rovnaké miesto.
Napíšem: ASD'\t'ASD a môže byť medzi nimi medzera na 10 znakov..
Napíšem: ABCddd'\t'ABC a môže byť medzi nimi medzera štyri znaky.
Tu som spravil príkladný kód: 

#include <stdio.h>

#define AND &&
#define OR ||

int main(void)
{
    register int i, c;
    int predkoncom = 0;
    char pole[1000];
    printf("Poprosim nepouzivat tabulator.\a\n");
    while (1)
    {
        for (i = 0; i < 1000; i++)
            pole[i] = '\0';
        for (i = 0, c = getchar(); i < 1000, c != '\n'; c = getchar(), i++)
            pole[i] = c;
        for (i--; pole[i] != '\0'; i--)
            if ((i != 0) AND (i % 80 == 0))
                predkoncom = 1;
            else if (predkoncom AND (pole[i] == ' '))
                pole[i] = '\n', predkoncom = 0;
        for (i = 0; pole[i] != '\0'; i++)
            if (pole[i] == '*')
                return 0;
            else
                putchar(pole[i]);
        putchar('\n');
    }
    return 0;
}

Funguje tak, že číta vstup až do napísania hviezdičky. Ak sa nachádza nejaké slovo medzi riadkami, tak ho posunie na nový riadok. Klasická vec čo robí word.
Problém je v tom, že nemožno kontrolovať tabulátory, pretože tabulátor nezaberie vždy rovnako miesta, takže ho neviem nahradiť napríklad štyrmi medzerami...
Skúste si to napríklad napísaním viacerých tabulátorov a viacerých znakov a uvidíte, že to zaberie povedzme 5 riadkov, ale stále to bude menej než 80 znakov. Keďže neviem kolko optických medzier zaberá jeden tabulátor, neviem ho za medzery vymeniť.

Nahlásit jako SPAM
IP: 195.91.13.–
Kit+15
Guru
30. 12. 2013   #13
-
0
-

#12 Tango
Zatím jsme totiž nepochopili, k čemu je to dobré.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Tango0
Newbie
30. 12. 2013   #14
-
0
-

Ten skript je len príklad, mal by zahýbať slová tak ako to robí word. 
Viď vyššie príspevok, vysvetlenie prečo nefunguje.

Nahlásit jako SPAM
IP: 195.91.13.–
JoDiK
~ Anonymní uživatel
987 příspěvků
30. 12. 2013   #15
-
0
-

#14 Tango
Opravdu jsme nepochopili a dokud nepopíšeš čeho chceš dosáhnout ani nepochopíme.

mal by zahýbať slová tak ako to robí word

Jako že  to má třeba zarovnávat do bloku (obě strany) vkládáním mezer mezi slova?

Keďže neviem kolko optických medzier zaberá jeden tabulátor, neviem ho za medzery vymeniť.

Možná bude teda problém v tom, že jsi nepochopil, jak funguje tabulátor ve vyšších textových editorech...

Tam přece nepřeskakuje nějaký daný počet mezer, ale skáče na nejbližší přednastavenou pozici. Ta může být daná buď výchozím krokem, nebo tabulační značkou (zarážkou) nebo pozicí začátku ostatních řádků u předsazeného textu.

Nebo-li, pokud pořádně nevysvětlíš co chceš, není ti rady ani pomoci...

Nahlásit jako SPAM
IP: 88.103.233.–
Tango0
Newbie
30. 12. 2013   #16
-
0
-

Chápeš to, ide o to, aby som nahradil tab medzerami..
Lenže tu nejde o vyššie textové editory.. 
Dal som hore kratky kod, na ktorom si to môžeš odskúšať - ono to automaticky zarovnáva aj pri C99 výslednej aplikacii, akoby ten compiler mal prístup k aplikácii po vytvorení.

Nahlásit jako SPAM
IP: 195.91.13.–
Řešení
JoDiK
~ Anonymní uživatel
987 příspěvků
30. 12. 2013   #17
-
0
-
Vyřešeno Nejlepší odpověď

#16 Tango
Teď už ti nerozumím vůbec, nechápu co ta věta znamená:

ono to automaticky zarovnáva aj pri C99 výslednej aplikacii, akoby ten compiler mal prístup k aplikácii po vytvorení

ten příklad cos sem dal pokud můžu soudit  nic nezarovnává, ani neupravuje, jen ukončuje řádky na úrovni slov tak, aby nebyly delší než 80 znaků. Jestli to má dělat jenom toto, tak prostě nahraď tabulátor jednou mezerou, fakt nevím co řešíš...

Nahlásit jako SPAM
IP: 88.103.233.–
Tango0
Newbie
30. 12. 2013   #18
-
0
-

ten příklad cos sem dal pokud můžu soudit  nic nezarovnává, ani neupravuje, jen ukončuje řádky na úrovni slov tak, aby nebyly delší než 80 znaků.

Prepáčte, nevedel som sa vyjadriť, ale myslel som toto.
No a tu je ten problém.
Nahradiť tabulátor jednou medzerou nemôžem, to už by nemalo rovnakú grafickú úpravu.
Ale asi máš pravdu, to je najrozumnejšie.
Kašlem na nejakú zložitú úpravu.. Skrátka tam nepovolím použitie tabulátora. 

Nahlásit jako SPAM
IP: 195.91.13.–
Kit+15
Guru
30. 12. 2013   #19
-
0
-

#18 Tango
Tabulátory běžně používám, ale nechávám editor, aby zdroják odsazoval tak, jak se odsazovat má a nekecám mu do toho. Dělá mi i mezery kolem operátorů, zalamování dlouhých řádek, hlídá mezery za čárkami, kolem závorek,... Nemám tedy potřebu vytvářet podobné nástroje.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
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, 36 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ý