OldComp.cz

Komunitní diskuzní fórum pro fanoušky historických počítačů


Právě je 12.09.2024, 20:56

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 5 ] 
Autor Zpráva
 Předmět příspěvku: Formatovani textu v C pomoci fprintf
PříspěvekNapsal: 02.08.2024, 13:23 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1296
Has thanked: 102 times
Been thanked: 195 times
Tohle uz jste nekdy videli?
Vetsinou jsem pouzival formatovani cisel, ale nikdy retezcu/textu.

Kód:
#include <stdio.h>

void funkce(int min, int max, char * text)
{
    printf(" -----------------------\n");
    printf("Test: [%s]\n",text);
    printf(" min: %d\n", min);
    printf(" min: %d\n", max);
    printf("Test: [123456789 123456789 123456789]\n");
    printf("Test: [%*.*s]\n",min,max,text);
    printf("Test: [%*.*s]\n",-min,max,text);
}

int main() {
    // Write C code here
    char text[] = "Ahoj Svete!";
    funkce(2,8,text);
    funkce(2,100,text);
    funkce(15,100,text);
    funkce(15,2,text);
    funkce(10,2,text);
   
    printf("[%-8.8s] [%8.8s]\n", "hello", "hello");
   
    return 0;
}

Kód:
 -----------------------
Test: [Ahoj Svete!]
 min: 2
 min: 8
Test: [123456789 123456789 123456789]
Test: [Ahoj Sve]
Test: [Ahoj Sve]
 -----------------------
Test: [Ahoj Svete!]
 min: 2
 min: 100
Test: [123456789 123456789 123456789]
Test: [Ahoj Svete!]
Test: [Ahoj Svete!]
 -----------------------
Test: [Ahoj Svete!]
 min: 15
 min: 100
Test: [123456789 123456789 123456789]
Test: [    Ahoj Svete!]
Test: [Ahoj Svete!    ]
 -----------------------
Test: [Ahoj Svete!]
 min: 15
 min: 2
Test: [123456789 123456789 123456789]
Test: [             Ah]
Test: [Ah             ]
 -----------------------
Test: [Ahoj Svete!]
 min: 10
 min: 2
Test: [123456789 123456789 123456789]
Test: [        Ah]
Test: [Ah        ]
[hello   ] [   hello]


Hledal jsem formatovani textu, hlavne slo o omezeni delky a nasel tohle.
Zda se ze to lze pomoci dvou cisel.
Zacneme druhym, protoze se zda ze je prvnim ktere se provede.
To "orizne" retezec pokud je delsi.
Druhe cislo pak pokud je vysledek kratsi doplni retezec mezerami PRED retezcem.
A pokud je to zaporne tak ZA retezcem.

Ma to bohuzel hacek, protoze chci zarovnane tisknout
Kód:
LD [...], HL    ; 3:16
nebo
LD HL,[...]     ; 3:16

Kde "..." je neznamy retezec (label). A jde mi o to, aby ";" zacinalo na stejnem sloupci, pokud je "..." dlouhy tak klidne pozdeji.

Jenze musim zjistit zda nahodou C neumi snadno spojit 2 retezce do jednoho... neco jako

printf("%d",min+max);

protoze misto pouheho "..." zarovnavam v prvnim pripade "...], HL" a ve druhem pripade "...]".

PS: Sorry v nazvu vlakna je fprintf misto printf. Ale ono je to jedno... fprintf(stdout,"...

PPS: Ta maximalni hodnota se neda preskocit nebo co...
Kód:
    printf("[%-8.s] [%8.s]\n", "hello", "hello");
    printf("[%-8.0s] [%8.0s]\n", "hello", "hello");

Kód:
[        ] [        ]
[        ] [        ]

To je trochu neprijemne, protoze kdyz tam teda dam neco velkeho tak stale teoreticky se to muze oriznout... takze v mistech kde bude "label:" bych to mel asi taky tisknout pres min.max pro jistotu...

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
PříspěvekNapsal: 02.08.2024, 14:27 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1296
Has thanked: 102 times
Been thanked: 195 times
Zda se ze reseni co potrebuji bez toho ze bych pouzil jinou nez stdio.h knihovnu a rucne pocital delku retezcu je tohle:
Kód:
#include <stdio.h>

void my_print(int size, char* text0, char*text1, char* text2, char * text3)
{
    int i;
    i  = printf("%s",text0);
    i += printf("%s",text1);
    if ( size > i )
        printf("%-*.*s",size-i,100,text2); // kde 100 je hodnota urcite vetsi nez text2, ktera neni neznama v dobe prekladu protoze je to "]" nebo ", HL" atd.
    else
        printf("%s",text2);
    printf("%s",text3);
}

int main() {
    // Write C code here
    printf("123456789 123456789 123456789\n");
    my_print(20,"   ld  HL,[","abc",         "]",    "; 3:16\n");
    my_print(20,"   ld [",    "abc",         "], HL","; 3:16\n");
    my_print(20,"   ld  HL,[","abcdefg",     "]",    "; 3:16\n");
    my_print(20,"   ld [",    "abcdefg",     "], HL","; 3:16\n");
    my_print(20,"   ld  HL,[","abcdefghijkl","]",    "; 3:16\n");
    my_print(20,"   ld [",    "abcdefghijkl","], HL","; 3:16\n");
    return 0;
}

Vyuziva se toho ze printf vraci pocet vytistenych znaku, coz se skoro vzdy ignoruje, takze asi vetsina ani nevi ze to neco vraci a dalsi si neni jista zda to nevraci nahodou succes/cislo chyby.
Kód:
123456789 123456789 123456789
   ld  HL,[abc]     ; 3:16
   ld [abc], HL     ; 3:16
   ld  HL,[abcdefg] ; 3:16
   ld [abcdefg], HL ; 3:16
   ld  HL,[abcdefghijkl]; 3:16
   ld [abcdefghijkl], HL; 3:16

To prvni cislo udava kolik se vytiskne znaku nez se bude tisknout "info"/posledni retezec/text3/znak ";".
A je to bez orezavani.

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
PříspěvekNapsal: 02.08.2024, 14:39 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3799
Bydliště: Bratislava
Has thanked: 375 times
Been thanked: 811 times
_dworkin píše:
Tohle uz jste nekdy videli?
Vetsinou jsem pouzival formatovani cisel, ale nikdy retezcu/textu.
...
Jasne, to su standartne ceckove metody ako riadit vypis textu. To pozna kazdy kto seriozne programuje v cecku.

Btw. navratovu hodnotu z printf - pocet vypisanych znakov - tiez niekedy vyuzivam.

Ale ked si uz zacal tuto temu zacal, tak napriklad scitanie retazca a cisla je taky vyssi level programovania v cecku, predpokladam ze to nepoznas:
Kód:
printf("Hello world" + 6);
:D


Nahoru
 Profil  
 
PříspěvekNapsal: 02.08.2024, 14:57 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1296
Has thanked: 102 times
Been thanked: 195 times
Busy píše:
_dworkin píše:
Tohle uz jste nekdy videli?
Vetsinou jsem pouzival formatovani cisel, ale nikdy retezcu/textu.
...
Jasne, to su standartne ceckove metody ako riadit vypis textu. To pozna kazdy kto seriozne programuje v cecku.

Btw. navratovu hodnotu z printf - pocet vypisanych znakov - tiez niekedy vyuzivam.

Ale ked si uz zacal tuto temu zacal, tak napriklad scitanie retazca a cisla je taky vyssi level programovania v cecku, predpokladam ze to nepoznas:
Kód:
printf("Hello world" + 6);
:D

Prvni odhad je ze to vynecha prvnich 6 znaku z retezce.

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
PříspěvekNapsal: 02.08.2024, 15:04 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3799
Bydliště: Bratislava
Has thanked: 375 times
Been thanked: 811 times
Kód:
printf("Hello world" + 6);
_dworkin píše:
Prvni odhad je ze to vynecha prvnich 6 znaku z retezce.
Velmi spravne ;)


Nahoru
 Profil  
 
Zobrazit příspěvky za předchozí:  Seřadit podle  
Odeslat nové téma Odpovědět na téma  [ Příspěvků: 5 ] 

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 1 návštěvník


Nemůžete zakládat nová témata v tomto fóru
Nemůžete odpovídat v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete přikládat soubory v tomto fóru

Hledat:
Přejít na:  
Založeno na phpBB® Forum Software © phpBB Group
Český překlad – phpBB.cz