retazec

Programovacie jazyky, rady, poradňa...
miki11
Light Expert
Light Expert
Príspevky: 74
Registrovaný: 09 feb 2008, 13:59

retazec

Príspevok od používateľa miki11 »

Uz neviem ako dalej.
chcem program v cecku, ktory nacita nejaky retazec napr babka.
Teda vypise "zadaj retazec" a ja napisem "babka" .
A teraz chcem pristupovat k jednotlivim znakom.
Nech ten retazec ma nazov str (ako string).
Tento str obsahuje znaky b a b k a ,jeho dlzka je 5.
Chcem aby mi vypisalo napr
str[1] je b.
str[2] je a
str[3] b
str[4] k
str[5] a

dakujem za pomoc
neutronmind
Expert
Expert
Príspevky: 189
Registrovaný: 05 aug 2008, 14:17

Príspevok od používateľa neutronmind »

Kód: Vybrať všetko

for (i=0; i<dlzka; i++) 
printf("str[%d] je: %c\n", i+1, retazec[i]);
Inak retazce (a polia) zacinaju vzdy od nuly, retazce taktiez koncia znakom '\0', cize vzdy pre ne treba alokovat o jeden prvok viac ako je potrebne - to je len take upozornenie, byva to zdrojom chyb. :wink:
miki11
Light Expert
Light Expert
Príspevky: 74
Registrovaný: 09 feb 2008, 13:59

Príspevok od používateľa miki11 »

neutronmind napísal:

Kód: Vybrať všetko

for (i=0; i<dlzka; i++) 
printf("str[%d] je: %c\n", i+1, retazec[i]);
Inak retazce (a polia) zacinaju vzdy od nuly, retazce taktiez koncia znakom '\0', cize vzdy pre ne treba alokovat o jeden prvok viac ako je potrebne - to je len take upozornenie, byva to zdrojom chyb. :wink:
jaaaaaaaj ja som lama ja som str deklaroval ako "%s" a ono malo byt "%c"
dakujem.

estema zaujma ze ked mam str ako str[10] a zadam 12 znakov tak mi ich vypise vsetky 12 ako sa takato chyba osetruje aby to robilo tak ako je nadeklarovane.
neutronmind
Expert
Expert
Príspevky: 189
Registrovaný: 05 aug 2008, 14:17

Príspevok od používateľa neutronmind »

Das scanf("%10s", retazec);. :)

(zda sa mi, ze sa to da aj scanf("%*s", 10, retazec); - ak by nebol vopred znamy pocet znakov retazca(teda namiesto 10 tam mozes dat aj premennu)). :)
miki11
Light Expert
Light Expert
Príspevky: 74
Registrovaný: 09 feb 2008, 13:59

Príspevok od používateľa miki11 »

chlapy celkom by ma zaujmalo aky je rozdiel v zapise "%s" a "%c" o co sa tam jedna pri praci z retazcom a polom. :?
neutronmind
Expert
Expert
Príspevky: 189
Registrovaný: 05 aug 2008, 14:17

Príspevok od používateľa neutronmind »

Pokial pouzijes %c, to znamena, ze chces tlacit len jeden znak, pokial %s, vypisujes cely retazec(teda pole znakov). :wink:
miki11
Light Expert
Light Expert
Príspevky: 74
Registrovaný: 09 feb 2008, 13:59

Príspevok od používateľa miki11 »

Da sa v retazci menit male pismeno na velke, alebo sa to da robit iba v jendorozmernom poli.
Pri nacitani zo suboru.
neutronmind
Expert
Expert
Príspevky: 189
Registrovaný: 05 aug 2008, 14:17

Príspevok od používateľa neutronmind »

V C nie je ziadny rozdiel medzi retazcom a jednorozmernym polom znakov. ;) Mozes pouzit makro toupper(char x) z <ctype.h> (vracia velke pismeno x) :)
miki11
Light Expert
Light Expert
Príspevky: 74
Registrovaný: 09 feb 2008, 13:59

Príspevok od používateľa miki11 »

vyriesene:

Kód: Vybrať všetko

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <ctype.h>
#include <string.h>

main()
{
 FILE *vstup;
 int i;
 char str[80];

 clrscr();
 vstup=fopen("b.txt","r");

 while(fgets(str,80,vstup)!=NULL)
 {
   for(i=0;i<strlen(str);i++)
   str[i]=toupper(str[i]);
    printf("%s",str);
    }

fclose(vstup);
getch();
}
neutronmind
Expert
Expert
Príspevky: 189
Registrovaný: 05 aug 2008, 14:17

Príspevok od používateľa neutronmind »

Dalo sa to aj casovo a pamatovo efektivnejsie:

Kód: Vybrať všetko

#include <stdio.h>  
#include <conio.h> 
#include <ctype.h> 

int main(void) 
{ 
 FILE *vstup; 
 int c;

 clrscr(); 
 vstup=fopen("b.txt","r"); 


 while ((c=getc(vstup))!=EOF) 
	 putchar(toupper(c));

 fclose(vstup); 
 getch(); 
}
miki11
Light Expert
Light Expert
Príspevky: 74
Registrovaný: 09 feb 2008, 13:59

Príspevok od používateľa miki11 »

tiez ma to napadlo, ale islo mi o technicku pracu s retazcom a jeho parametrami. Teda to int c malo byt char c[x], alebo char *c.
Ale v pripade nudze je aj toto good riesenie, dik.

//autoeditácia príspevku ( 23 Jan 2009, 16:19 )
da sa pomocou strchr najst viacnasobny vyskyt znaku?
strchr mi najde iba vyskyt prveho znaku a ukonci hladanie, ako to mam spravit aby hladal az do konca.
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Potrebnú funkciu si musíš napísať sám (buď použiješ strchr v cykle a vždy začneš hľadať za nájdeným znakom, alebo tam dáš cyklus, ktorý bude prechádzať celý reťazec...).
miki11
Light Expert
Light Expert
Príspevky: 74
Registrovaný: 09 feb 2008, 13:59

Príspevok od používateľa miki11 »

chrono napísal:Potrebnú funkciu si musíš napísať sám (buď použiješ strchr v cykle a vždy začneš hľadať za nájdeným znakom, alebo tam dáš cyklus, ktorý bude prechádzať celý reťazec...).
Ja som si napisal take nieco ale myslel som ze to bude troska jednoduchsie.

Este si neviem poradit s jednim prikloadom:
napiste funkciu xxxx(char *s1, char *s2, int i);
ktora vlozi do retazca s1 od pozicie i retazec s2. Vyuzite funkciu strcat(). :cry:
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Musíš si vytvoriť buffer, ktorý bude veľký strlen(s1) + strlen(s2) + 1; Doň potom skopíruješ ten reťazec s1 (kľudne celý, bude to tak jednoduchšie; môžeš použiť strcpy prípadne aj strcat). Na i-tu pozíciu potom vložíš znak '\0', pomocou str cat tam pripojíš s2 a nakoniec zvyšok toho reťazca s1 (teda niečo ako &(s1)).
Napísať odpoveď