Forum Apl Inf
Would you like to react to this message? Create an account in a few clicks or log in to continue.

10.1 Transformace textu

2 posters

Goto down

10.1 Transformace textu Empty 10.1 Transformace textu

Příspěvek pro Radovan Bednár 31/1/2015, 20:36

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é??

Radovan Bednár

Poèet pøíspìvkù : 4
Join date : 18. 01. 15

Návrat nahoru Goto down

10.1 Transformace textu Empty Re: 10.1 Transformace textu

Příspěvek pro adam.korinek 2/2/2015, 08:35

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...


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

Návrat nahoru Goto down

10.1 Transformace textu Empty Re: 10.1 Transformace textu

Příspěvek pro adam.korinek 2/2/2015, 11:05

Jo a jinak jeste k tvemu dotazu, samozreme ze tady tento priklad lze udelat jen s jednim pointerem...ale bohuzel, chteli nas zmasti Very Happy

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

Návrat nahoru Goto down

10.1 Transformace textu Empty Re: 10.1 Transformace textu

Příspěvek pro Radovan Bednár 14/2/2015, 16:23

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:

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

Návrat nahoru Goto down

10.1 Transformace textu Empty Re: 10.1 Transformace textu

Příspěvek pro adam.korinek 14/2/2015, 22:15

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....

adam.korinek

Poèet pøíspìvkù : 25
Join date : 18. 11. 14

Návrat nahoru Goto down

10.1 Transformace textu Empty Re: 10.1 Transformace textu

Příspěvek pro Sponsored content


Sponsored content


Návrat nahoru Goto down

Návrat nahoru


 
Povolení tohoto fóra:
Nemůžete odpovídat na témata v tomto fóru