Ako vybrať časť textu z premennej.

C,C++,C#

Moderátori: psichac, Moderátori

Používateľov profilový obrázok
gfox
Stály člen
Stály člen
Príspevky: 199
Dátum registrácie: 12 Mar 2013, 20:16
Bydlisko: Lovinobaňa
Vek: 53

Ako vybrať časť textu z premennej.

Príspevok od používateľa gfox » 14 Feb 2024, 19:58

Pasujem sa v arduino ide s výpisom na displej,
Mám displej lcd 4x20.
Mám takýto kus kódu:

Kód: Vybrať všetko

void audio_showstation(const char* info) {
    Serial.printf("showstation: %s\n", info);
    lcd.setCursor(0,1);
    lcd.print(info);
}
Toto mi vypíše na terminál text s premennej "info". A na druhý riadok displeja tiež. Toto je v poriadku. Ale keď má premenná "info" viac textu ako 20 znakov, tak mi to prepíše viac riadkov na displeji. Ja potrebujem s premennej "info" vybrať povedzme prvých 20znakov a len tie vypísať na displej.
Doteraz som robil v bascome, tam je text v premennej typu string. Tam sú funkcie na prácu s reťazcami napr. LEFT() alebo MID().
Ale tu neviem presne čo je to za typ const char *. Ani sa neviem dopátrať na webe ako urobiť to čo chcem.
0


Používateľov profilový obrázok
gfox
Stály člen
Stály člen
Príspevky: 199
Dátum registrácie: 12 Mar 2013, 20:16
Bydlisko: Lovinobaňa
Vek: 53

Re: Ako vybrať časť textu z premennej.

Príspevok od používateľa gfox » 14 Feb 2024, 21:49

Ďakujem za reakciu, ale takýchto odkazov som dnes už prešiel desiatky.
Potrebujem naozaj príklad.
Povedzme že const char *info obsahuje text o dĺžke 40 znakov. Ako vypíšem na displej iba posledných 20 znakov.
Používam knižnicu LiquidCrystal_I2C.h
Potrebujem vedieť ako vybrať hocijakú časť textu, a vložiť do nejakej premennej aby som to mohol vypísať na displej.
0

stefanSK
Pokročilý člen
Pokročilý člen
Príspevky: 752
Dátum registrácie: 24 Jún 2010, 00:00
Bydlisko: Trnava
Vek: 68

Re: Ako vybrať časť textu z premennej.

Príspevok od používateľa stefanSK » 14 Feb 2024, 21:57

takto:
void audio_showstation(const char* info) {
uchar prvyZnak=20;
Serial.printf("showstation: %s\n", &info[prvyZnak]);
lcd.setCursor(0,1);
lcd.print(info);
}

Toto platí ak dlžka reťazca je 40.
inak pre výpis posledných 20 znakov reťazca dĺžky > 20 platí ():
prvyZnak= strlen(info)-20;
0
S.K.

Používateľov profilový obrázok
Andy99
Stály člen
Stály člen
Príspevky: 339
Dátum registrácie: 05 Mar 2008, 00:00
Bydlisko: BA
Vek: 35

Re: Ako vybrať časť textu z premennej.

Príspevok od používateľa Andy99 » 14 Feb 2024, 22:03

Napádajú ma hneď 4 riešenia.
- Použi napr. sprintf s medzibufferom, kde si uložiť presne toľko znakov, potrebuješ.
- Ak vieš na aký typ ukazuje pointer, podľa jeho veľkosti vieš postupne cez neho iterovať až po dĺžku ktorú potrebuješ. A následne vypísať.
- Pozrieš sa, ako dobre je printf implementovaná a použiješ priamo jej funkcionalitu na výpis podľa počtu znakov.
- Vytvoríš si vlastnú funkciu, ktorá ten string proste zoseká.
Riešení je samozrejme oveľa viacej.
0

Používateľov profilový obrázok
gfox
Stály člen
Stály člen
Príspevky: 199
Dátum registrácie: 12 Mar 2013, 20:16
Bydlisko: Lovinobaňa
Vek: 53

Re: Ako vybrať časť textu z premennej.

Príspevok od používateľa gfox » 14 Feb 2024, 22:27

stefanSK napísal:
14 Feb 2024, 21:57
takto:
void audio_showstation(const char* info) {
uchar prvyZnak=20;
Serial.printf("showstation: %s\n", &info[prvyZnak]);
lcd.setCursor(0,1);
lcd.print(info);
}

Toto platí ak dlžka reťazca je 40.
inak pre výpis posledných 20 znakov reťazca dĺžky > 20 platí ():
prvyZnak= strlen(info)-20;
Rozumiem čo sa mi snažíš povedať, ale upravil si serial.printf. Výpis na terminál ma netrápi. Mne ide o lcd.print.
Andy99 napísal:
14 Feb 2024, 22:03
Napádajú ma hneď 4 riešenia.
- Použi napr. sprintf s medzibufferom, kde si uložiť presne toľko znakov, potrebuješ.
- Ak vieš na aký typ ukazuje pointer, podľa jeho veľkosti vieš postupne cez neho iterovať až po dĺžku ktorú potrebuješ. A následne vypísať.
- Pozrieš sa, ako dobre je printf implementovaná a použiješ priamo jej funkcionalitu na výpis podľa počtu znakov.
- Vytvoríš si vlastnú funkciu, ktorá ten string proste zoseká.
Riešení je samozrejme oveľa viacej.
Ďakujem, ale naozaj potrebujem príklad. Netuším čo znamená "sprintf s medzibuferom".
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Ako vybrať časť textu z premennej.

Príspevok od používateľa peterple » 14 Feb 2024, 22:33

V prvom rade sa rozhodni čo vlastne chceš. Pretože
gfox napísal:
14 Feb 2024, 21:49
Ako vypíšem na displej iba posledných 20 znakov.
a
gfox napísal:
14 Feb 2024, 21:49
Potrebujem vedieť ako vybrať hocijakú časť textu, a vložiť do nejakej premennej aby som to mohol vypísať na displej.
Sú úplne dve rozdielne veci ktoré treba riešiť úplne iným spôsobom. Nečuduj sa že keď položíš nejasnú otázku, tak dostaneš všeobecnú odpoveď ktorá pokrýva možnosti na ktoré si sa pýtal.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
gfox
Stály člen
Stály člen
Príspevky: 199
Dátum registrácie: 12 Mar 2013, 20:16
Bydlisko: Lovinobaňa
Vek: 53

Re: Ako vybrať časť textu z premennej.

Príspevok od používateľa gfox » 14 Feb 2024, 23:12

Proste potrebujem vybrať nejakú časť textu z premennej z prvého príspevku "const char*" aby som ju vedel vypísať na jednom riadku lcd displeja. Je jedno či prvých 20 znakov alebo posledných 10znakov, alebo 15 znakov niekde v strede. Podľa toho ako budem potrebovať.
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Ako vybrať časť textu z premennej.

Príspevok od používateľa peterple » 14 Feb 2024, 23:27

No moc si to teda neupresnil. Tiež aj preto že používaš blbú terminológiu. To čo nazývaš premenná, žiadna premenná nie je. Prečítaj si prosím kapitolu 15 v tomto odkaze https://www.smnd.sk/anino/moje/C.pdf#page=40

Mal by si tam nájsť v prvom rade odpoveď na to ako sa v C pracuje s textovými reťazcami a potom aj to čo ťa trápi.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
Andy99
Stály člen
Stály člen
Príspevky: 339
Dátum registrácie: 05 Mar 2008, 00:00
Bydlisko: BA
Vek: 35

Re: Ako vybrať časť textu z premennej.

Príspevok od používateľa Andy99 » 15 Feb 2024, 06:41

gfox napísal:
14 Feb 2024, 23:12
Proste potrebujem vybrať nejakú časť textu z premennej z prvého príspevku "const char*" aby som ju vedel vypísať na jednom riadku lcd displeja. Je jedno či prvých 20 znakov alebo posledných 10znakov, alebo 15 znakov niekde v strede. Podľa toho ako budem potrebovať.
V tom prípade napr. memcpy je tvoj kamarát. Vytvoríš si napr. vlastnú funkciu, ktorá ti vráti novo zosekaný string. Nezabudni na /0.

Existujú samozrejme aj menej výpočtovo/pamäťovo náročné metódy, ale najprv otestuj toto.
0

Používateľov profilový obrázok
Radus
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1497
Dátum registrácie: 27 Okt 2009, 00:00
Bydlisko: Prešov
Vek: 42

Re: Ako vybrať časť textu z premennej.

Príspevok od používateľa Radus » 15 Feb 2024, 08:31

...prvých 20...

Kód: Vybrať všetko

char newChar[21];
uint i;

for(i=0; i<21; i++)
{
if(oldChar=='/0') break;
newChar[i]=oldChar[i];
}
newChar[i+1]='/0';

//nepísal som to v prostredí C tak sa ospravedlňujem ak sú tam syntaktické chyby a dlhšie som ani v C nerobil ale v C#, ak je inicializácia poľa nesprávna... dúfam že C pozná príkaz break :)
0

stefanSK
Pokročilý člen
Pokročilý člen
Príspevky: 752
Dátum registrácie: 24 Jún 2010, 00:00
Bydlisko: Trnava
Vek: 68

Re: Ako vybrať časť textu z premennej.

Príspevok od používateľa stefanSK » 15 Feb 2024, 09:34

príklad na výber časti textu od indexu 10, dĺžky 5:
//potom buf poslať na LCD
char buf[40];
char b[50];

strcpy(b,"toto je text z ktoreho sa ma kopirovat 5 znakov");

strncpy(buf,(const char *)&b[10],5);
0
S.K.

Používateľov profilový obrázok
gfox
Stály člen
Stály člen
Príspevky: 199
Dátum registrácie: 12 Mar 2013, 20:16
Bydlisko: Lovinobaňa
Vek: 53

Re: Ako vybrať časť textu z premennej.

Príspevok od používateľa gfox » 15 Feb 2024, 10:05

Ďakujem chlapi, idem to skúšať.
0

Používateľov profilový obrázok
YellowJacket
Pokročilý člen
Pokročilý člen
Príspevky: 503
Dátum registrácie: 05 Feb 2012, 11:58
Bydlisko: Hrinova
Vek: 33

Re: Ako vybrať časť textu z premennej.

Príspevok od používateľa YellowJacket » 15 Feb 2024, 11:13

Pokial tam nechces linkovat ziadne kniznice navyse kvoli jednej funkcii, tak si napis funkciu sam ( i ked ano, v arduine sa sotva mozme bavit o setreni pamate, ze jo ):

Kód: Vybrať všetko

void copyCharsFromIndex( const char *str_in, char *str_out, int index, int count ) {

    int i;


        /* maximalne 20 znakov */
    if ( count > 20 )
        count = 20;

        /* kopirovanie znakov */
    for ( i = 0; i < count; i++ )
        str_out[i] = str_in[index + i];

    str_out[i] = '\0';

}
C-ckovy priklad pouzitia:

Kód: Vybrať všetko

const char  str[] = "aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeee";
char        buffer[21];


copyCharsFromIndex( str, buffer, 0, 6 );
printf( "%s\n\n", buffer );    /* aaaaaa */

copyCharsFromIndex( str, buffer, 10, 20 );
printf( "%s\n\n", buffer );    /* abbbbbbbbbbccccccccc */

copyCharsFromIndex( str, buffer, 20, 30 );
printf( "%s\n\n", buffer );    /* bccccccccccddddddddd */
0

Používateľov profilový obrázok
gfox
Stály člen
Stály člen
Príspevky: 199
Dátum registrácie: 12 Mar 2013, 20:16
Bydlisko: Lovinobaňa
Vek: 53

Re: Ako vybrať časť textu z premennej.

Príspevok od používateľa gfox » 15 Feb 2024, 12:16

Ďakujem chlapi. Toto som potreboval, vidieť nejaké príklady riešenia. Už to chápem.
Na moje prekvapenie prinf funguje aj pri výpise na displej "lcd.printf".
A tým pádom funguje riešenie ktoré mi dal stefansk už v prvom príspevku.
Čiže moje riešenie je zatiaľ takéto:

Kód: Vybrať všetko

void audio_showstreamtitle(const char* info) {
  Serial.printf("streamtitle: %s\n", info);
  lcd.setCursor(0, 1); 
  lcd.print("                    ");
  lcd.setCursor(0, 1);
  lcd.printf("%.20s",info); //vypíše prvých 20 znakov s "info"
  lcd.setCursor(0, 2);
  lcd.print("                    ");
  //ak je text dlhší ako 20 znakov tak sa vypíšu do dalsieho riadku
  if (strlen(info)>20){
    lcd.setCursor(0, 2);
    lcd.printf("%.20s",&info[20]);
  }
  lcd.setCursor(0, 3);
  lcd.print("                    ");
  //ak je text dlhší ako 40 znakov 
  if (strlen(info)>40){
    lcd.setCursor(0, 3);
    lcd.printf("%.20s",&info[40]);
  }
}
Testujem to, zatial to robí to čo má. Je to internetové rádio a vypisuje mi interpreta a názov skladby na displej.
0

Atlan
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1148
Dátum registrácie: 01 Feb 2008, 00:00
Bydlisko: Kosice okolie

Re: Ako vybrať časť textu z premennej.

Príspevok od používateľa Atlan » 15 Feb 2024, 20:57

Preco si nedas beziaci text? I ked na lcd to mozno bude necitatelne.
0

Používateľov profilový obrázok
gfox
Stály člen
Stály člen
Príspevky: 199
Dátum registrácie: 12 Mar 2013, 20:16
Bydlisko: Lovinobaňa
Vek: 53

Re: Ako vybrať časť textu z premennej.

Príspevok od používateľa gfox » 15 Feb 2024, 22:11

Dlho mi ležal v šuplíku veľký displej 4x20 znakov. Tu ma napadlo ho využiť.
V prvom riadku je názov stanice a ďalšie tri riadky sú dosť na zobrazenie interpreta a názvu skladby.
Viac ma štve že namiesto písmen s dĺžňami a mäkčeňmi sa zobrazujú kadejaké kliky-háky.
0

Používateľov profilový obrázok
Radus
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1497
Dátum registrácie: 27 Okt 2009, 00:00
Bydlisko: Prešov
Vek: 42

Re: Ako vybrať časť textu z premennej.

Príspevok od používateľa Radus » 15 Feb 2024, 23:34

...daný displej asi nemá našu znakovú sadu. Buď si do neho uložíš vlastné znaky, mal by to umožňovať, alebo si spravíš konvertnú funkciu a diakritiku vyhodíš... miesto ň vypíšeš n a podobne...
0

Používateľov profilový obrázok
budvar10
Pokročilý člen
Pokročilý člen
Príspevky: 989
Dátum registrácie: 15 Dec 2014, 10:55
Bydlisko: Košice

Re: Ako vybrať časť textu z premennej.

Príspevok od používateľa budvar10 » 16 Feb 2024, 06:47

Buď si do neho uložíš vlastné znaky...
V takýchto displejoch môžeš uložiť 8 štandardných znakov, ak to vôbec podporuje. To je na SK diakritiku veľmi málo.

Ak chceš zistiť, aké to má znaky, daj si vypísať 0-255.
0

Používateľov profilový obrázok
Radus
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1497
Dátum registrácie: 27 Okt 2009, 00:00
Bydlisko: Prešov
Vek: 42

Re: Ako vybrať časť textu z premennej.

Príspevok od používateľa Radus » 16 Feb 2024, 07:54

...to by aj tak nefungovalo, keďže ascii kódom našej diakritike sú už priradené haky-baky... Treba odstrániť diakritiku z textu... Alebo má možno displej prepínateľné sady, už som videl aj to ;)
0

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok