10.1 Transformace textu
2 posters
Forum Apl Inf :: C
Strana 1 z 1
10.1 Transformace textu
Zdravím borci!
Prišli ste niekto na úlohu 10.1 Transformace textu? Mne to absolútne nedáva zmysel. Čo majú znamenať tie dve hviezdičky pri tom druhom parametri? Pointer na pointer? A načo je, preboha, niečo také dobré??
Prišli ste niekto na úlohu 10.1 Transformace textu? Mne to absolútne nedáva zmysel. Čo majú znamenať tie dve hviezdičky pri tom druhom parametri? Pointer na pointer? A načo je, preboha, niečo také dobré??
Radovan Bednár- Poèet pøíspìvkù : 4
Join date : 18. 01. 15
Re: 10.1 Transformace textu
Zdar tady mas program...
Pointer na pointer je uzitecna vec kdyz budes delat s vicerozmernymi dynamickymi poli + prave na predavani ruznych argumentu. Jinak pointeru muzes mi kolik chces klidne i char**** xxx; ale uz je to trosku matouci. Doufam ze kod pochopis jinak, dotazy...
Pointer na pointer je uzitecna vec kdyz budes delat s vicerozmernymi dynamickymi poli + prave na predavani ruznych argumentu. Jinak pointeru muzes mi kolik chces klidne i char**** xxx; ale uz je to trosku matouci. Doufam ze kod pochopis jinak, dotazy...
- kód:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFER_SIZE 128
int set(char* in, char** out);
int main(int argc, char **argv)
{
char inStr[BUFFER_SIZE] = {0};
char* outStr = NULL;
int changed = 0;
printf("Exercise 10.1\n");
printf("Enter string:");
if(!fgets(inStr, BUFFER_SIZE, stdin)) { //enter string
printf("Error load string...\n");
exit(EXIT_FAILURE);
}
int lenght = strlen(inStr); //include '\n' char as last
inStr[lenght - 1] = '\0'; //remove last char '\n' from fgets function
outStr = (char*)malloc(lenght); //alloc new string of lenght
if(!outStr) {
printf("Error in alloc memory...\n");
exit(EXIT_FAILURE);
}
changed = set(inStr, &outStr); //call function
printf("Original string: %s\n", inStr);
printf("Changed string: %s and changed letters: %d\n", outStr, changed);
free(outStr); //free alloc memory
getchar();
return 0;
}
int set(char* in, char** out)
{
char* tmpString = *out; //temp variable, out cannot be used like out++
int changed = 0; //changed letters
while(*in) {
if(*in >= 65 && *in <= 90) {
*tmpString = *in + 32;
changed++;
} else if(*in >= 97 && *in <= 122) {
*tmpString = *in - 32;
changed++;
} else {
*tmpString = *in;
}
in++;
tmpString++;
}
*tmpString = '\0'; //add ending char '\0'
return changed;
}
adam.korinek- Poèet pøíspìvkù : 25
Join date : 18. 11. 14
Re: 10.1 Transformace textu
Jo a jinak jeste k tvemu dotazu, samozreme ze tady tento priklad lze udelat jen s jednim pointerem...ale bohuzel, chteli nas zmasti
- kód:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFER_SIZE 128
int set(char* in, char* out);
int main(int argc, char **argv)
{
char inStr[BUFFER_SIZE] = {0};
char* outStr = NULL;
int changed = 0;
printf("Exercise 10.1\n");
printf("Enter string:");
if(!fgets(inStr, BUFFER_SIZE, stdin)) { //enter string
printf("Error load string...\n");
exit(EXIT_FAILURE);
}
int lenght = strlen(inStr); //include '\n' char as last
inStr[lenght - 1] = '\0'; //remove last char '\n' from fgets function
outStr = (char*)malloc(lenght); //alloc new string of lenght
if(!outStr) {
printf("Error in alloc memory...\n");
exit(EXIT_FAILURE);
}
changed = set(inStr, outStr); //call function
printf("Original string: %s\n", inStr);
printf("Changed string: %s and changed letters: %d\n", outStr, changed);
free(outStr); //free alloc memory
getchar();
return 0;
}
int set(char* in, char* out)
{
char* tmpString = out; //temp variable, out cannot be used like out++
int changed = 0; //changed letters
while(*in) {
if(*in >= 65 && *in <= 90) {
*tmpString = *in + 32;
changed++;
} else if(*in >= 97 && *in <= 122) {
*tmpString = *in - 32;
changed++;
} else {
*tmpString = *in;
}
in++;
tmpString++;
}
*tmpString = '\0'; //add ending char '\0'
return changed;
}
adam.korinek- Poèet pøíspìvkù : 25
Join date : 18. 11. 14
Re: 10.1 Transformace textu
Servus. Ďakujem za riešenie, až teraz som sa k nemu dostal. Po analýze kódu som dospel k niekoľkým otázkam či postrehom. Budem ti vďačný za odpovede či komentáre.
1. Prekvapilo ma, že alokácia pamäti sa robí v main(). Ja som si myslel, že pamäť si má alokovať funkcia, ktorá nejaké dáta tvorí (v našom prípade set(), ktorá tvorí nový reťazec)...
2. Načo je dobrá hláška "Error load string...\n"? Ako môže teoreticky nastať chyba pri načítaní reťazca?
3. Čo je exit(EXIT_FAILURE)? Je to niečo ako return 1?
4. Knižnica <string.h> nebola v tomto cvičení povolená. Ale prakticky je to jedno, lebo ju treba len na spočítanie dĺžky reťazca a to ide aj bez nej celkom jednoducho:
5. "Jo a jinak jeste k tvemu dotazu, samozreme ze tady tento priklad lze udelat jen s jednim pointerem...ale bohuzel, chteli nas zmasti" Tak musím konštatovať, že sa im to podarilo. Fakt nechápem, prečo by som mal funkcii odovzdávať parameter &outStr, keď outStr samotné je pointer (na začiatok poľa), čo si úspešne využil v druhom riešení...
6. Aký má zmysel uvádzať funkčný prototyp funkcie pred main() a definíciu tejto funkcie za main()? Nemôže sa funkcia rovno definovať na začiatku?
1. Prekvapilo ma, že alokácia pamäti sa robí v main(). Ja som si myslel, že pamäť si má alokovať funkcia, ktorá nejaké dáta tvorí (v našom prípade set(), ktorá tvorí nový reťazec)...
2. Načo je dobrá hláška "Error load string...\n"? Ako môže teoreticky nastať chyba pri načítaní reťazca?
3. Čo je exit(EXIT_FAILURE)? Je to niečo ako return 1?
4. Knižnica <string.h> nebola v tomto cvičení povolená. Ale prakticky je to jedno, lebo ju treba len na spočítanie dĺžky reťazca a to ide aj bez nej celkom jednoducho:
- kód:
int in_len = 0;
while (*(in + in_len))
in_len++;
5. "Jo a jinak jeste k tvemu dotazu, samozreme ze tady tento priklad lze udelat jen s jednim pointerem...ale bohuzel, chteli nas zmasti" Tak musím konštatovať, že sa im to podarilo. Fakt nechápem, prečo by som mal funkcii odovzdávať parameter &outStr, keď outStr samotné je pointer (na začiatok poľa), čo si úspešne využil v druhom riešení...
6. Aký má zmysel uvádzať funkčný prototyp funkcie pred main() a definíciu tejto funkcie za main()? Nemôže sa funkcia rovno definovať na začiatku?
Radovan Bednár- Poèet pøíspìvkù : 4
Join date : 18. 01. 15
Re: 10.1 Transformace textu
Zdarec...takze....
1. Alokaci muzes obecne provadet kde chces, kde se ti to to hodi...v tomto pripade delam alokaci noveho retezce o delce n, delka n je delka retezce ktereho nacitam do bufferu ve funkci main, funkce set k nemu nema pristup takze alokuji v main, ale jde to i jinak pres globalni promene ale to se nedela...moc
2. Tyhle hlasky co tam ja pisu jsou vetsinou pro debuggovani programu a abych vedel co se deje, a obecne kdyz chces rict ze se neco stalo spatne, funkce fgets mi muze vratit NULL kdyz proste dojde k spatnemu nacteni...preny priklad ti ted asi nereknu ale stat se to muze, tak to osetris...
3. exit(EXIT_FAILURE) je myslim to same jako return 1 :-D...kdyz vicemene to rika ze program proste skoncil s chybou...
4. Asi tak na ty jeho predpisy co on ta ma v zadani tak trosku kaslu a opravuju si to podle sebe, nema smysl mu spat v kazdem cviceni novou funkci strlen a nebo ji tam vlastim hlavickovym souborem includovat...pouzivam knihovnu...ale to je tim ze ja si to kdyztak muzu dovolit, tobe a ostatnim radim delejte to jak o to chce a piste si vlastni funcke....
5. Nevim co ti na to rict, proste opet ty cviceni funguji na to abys se naucil koncept pointeru... jelikoz do budoucich cviceni potrebujes znat a chapat co je to **, tak proto to tam asi je...
6. Takhle, ano muze, mas pravdu, ale kdyz budes mit delsi program treba 1000radku uz vidim jak budes pokazde rolovat tech 1000 radku aby ses dostal k main...je to proste takovy programatorsky zvyk, ze se funkce deklaruje napred, pred funkci main, a pak se az definuje za funkci main...ale opet tohle si muzes delat jak chces, jak to lepe vyhovuje tobe....
1. Alokaci muzes obecne provadet kde chces, kde se ti to to hodi...v tomto pripade delam alokaci noveho retezce o delce n, delka n je delka retezce ktereho nacitam do bufferu ve funkci main, funkce set k nemu nema pristup takze alokuji v main, ale jde to i jinak pres globalni promene ale to se nedela...moc
2. Tyhle hlasky co tam ja pisu jsou vetsinou pro debuggovani programu a abych vedel co se deje, a obecne kdyz chces rict ze se neco stalo spatne, funkce fgets mi muze vratit NULL kdyz proste dojde k spatnemu nacteni...preny priklad ti ted asi nereknu ale stat se to muze, tak to osetris...
3. exit(EXIT_FAILURE) je myslim to same jako return 1 :-D...kdyz vicemene to rika ze program proste skoncil s chybou...
4. Asi tak na ty jeho predpisy co on ta ma v zadani tak trosku kaslu a opravuju si to podle sebe, nema smysl mu spat v kazdem cviceni novou funkci strlen a nebo ji tam vlastim hlavickovym souborem includovat...pouzivam knihovnu...ale to je tim ze ja si to kdyztak muzu dovolit, tobe a ostatnim radim delejte to jak o to chce a piste si vlastni funcke....
5. Nevim co ti na to rict, proste opet ty cviceni funguji na to abys se naucil koncept pointeru... jelikoz do budoucich cviceni potrebujes znat a chapat co je to **, tak proto to tam asi je...
6. Takhle, ano muze, mas pravdu, ale kdyz budes mit delsi program treba 1000radku uz vidim jak budes pokazde rolovat tech 1000 radku aby ses dostal k main...je to proste takovy programatorsky zvyk, ze se funkce deklaruje napred, pred funkci main, a pak se az definuje za funkci main...ale opet tohle si muzes delat jak chces, jak to lepe vyhovuje tobe....
adam.korinek- Poèet pøíspìvkù : 25
Join date : 18. 11. 14
Forum Apl Inf :: C
Strana 1 z 1
Povolení tohoto fóra:
Nemůžete odpovídat na témata v tomto fóru