C: pristup ku znakom z retazca

Sekcia: Programovanie 19.03.2012 | 15:40
tommy   Návštevník
Zdravim,

potreboval by som mensiu pomoc (zaciatocnik).

mam definovany retazec napr. :
char* retazec = "linuxos";

problem mam v pristupe ku znakom. V knizke pisu, ze k nim mozem pristupovat ako ku polu (co som si aj ja myslel) --> retazec[4], ale kompilatoru sa to nepaci (pise iba RUN FAILED). Tak som skusal ziskat znak takto &retazec[4]. Program sa spusti, no vo vystupe je ten retazec len posunuty o 4 bity: "xos"

Otazka: Ako ziskam 4. znak retazca: "u"? Poprosim s vysvetlenim.

Dakujem
    • Re: C: pristup ku znakom z retazca 19.03.2012 | 16:38
      Avatar m4jkl   Používateľ
      znak 'u' ma index 3, lebo prvy znak ma index 0.

      chyba bude v tom, ako sa ten znak snazis vypisovat:

      printf("%c\n", retazec[3]);
      vypise 'u'

      ty pravdepodobne pouzivas %s
      • Re: C: pristup ku znakom z retazca 19.03.2012 | 21:02
        tommy   Návštevník
        v tom chybu nerobim
    • Re: C: pristup ku znakom z retazca 19.03.2012 | 21:37
      johnny   Návštevník
      A čo tak skopírovať na pastebin celý zdrojový kód a hodiť sem link, nech ti vieme pomôcť ?

      Mám taký ten pocit, že kompilátor ti to ani neskompiluje pretože to má byť takto:
      const char* retazec = "linuxos";

      alebo takto keď už tak:
      char* retazec = new char[8];
      strcpy(retazec,"linuxos");
      • Re: C: pristup ku znakom z retazca 19.03.2012 | 21:47
        Avatar m4jkl   Používateľ
        char* retazec = new char[8];

        ehm? :)


        na char *retazec = "linuxos"; nie je nic zle.


        ale priklanam sa k tomu, ze by sme potrebovali vidiet cely zdrojak.
        • Re: C: pristup ku znakom z retazca 19.03.2012 | 23:18
          johnny   Návštevník
          Presne tak new. malloc sa mi nepáči.

          Čo ja viem, ja by som to nerobil. nech sa chlapec naučí programovať tak ako sa to má. Za prvé, nemám rád warningy pri kompilácii, za druhé ak sa niekde v programe pokúsi uvoľniť to miesto, padne program.
          • Re: C: pristup ku znakom z retazca 19.03.2012 | 23:24
            Avatar m4jkl   Používateľ
            problem je, ze new je z c++, v cecku nie je.

            char *retazec = "linuxos";

            -negeneruje warning
            -ze spadne program pri pokuse o free() je spravne
            -cele je to uplne spravne

            inak
            char retazec[8];
            strcpy();

            kedze retazec bude na zasobniku, tak ten program pravdepodobne pri free() spadne tiez.
            • Re: C: pristup ku znakom z retazca 19.03.2012 | 23:30
              Avatar m4jkl   Používateľ
              ops, uz viem ako si to myslel s tym free(), ty si nepisal char retazec[8], ale dynamicky si si to alokoval. vtedy by to samozrejme nepadalo.
            • Re: C: pristup ku znakom z retazca 20.03.2012 | 00:40
              Avatar Fridolín Pokorný Fedora 21  Používateľ
              $ cat test.c
              #include <stdio.h>
              #include <stdlib.h>
              
              int main(void) {
                  char * retazec = "linuxos";
                  putchar(retazec[3]);
              
                  return EXIT_SUCCESS;
              }
              
              $ gcc -std=c99 test.c
              $ gcc -std=c99 test.c -Wwrite-strings
              test.c: In function 'main':
              test.c:5:22: warning: initialization discards 'const' qualifier from pointer target type [enabled by default]
              $ ./a.out 
              u

              Preco to "cele spravne" urcite nie je:
              $ cat test.c 
              #include <stdio.h>
              #include <stdlib.h>
              
              int main(void) {
                  char * retazec = "linuxos";
                  putchar(retazec[3]);
              
                  for (int i = 0; i < 100; ++i)
                      retazec[i] = 0;
              
                  return EXIT_SUCCESS;
              }
              $ gcc -std=c99 test.c                      
              $ ./a.out 
              Segmentation fault
              $ 
              
              • Re: C: pristup ku znakom z retazca 20.03.2012 | 00:50
                Avatar Fridolín Pokorný Fedora 21  Používateľ
                Uz je pozde, som unaveny :). Myslel som to samozrejme takto:
                $ cat test.c 
                #include <stdio.h>
                #include <stdlib.h>
                
                int main(void) {
                    char * retazec = "linuxos";
                    putchar(retazec[3]);
                
                    retazec[0] = 0;
                
                    return EXIT_SUCCESS;
                }
                
                $ gcc -std=c99 test.c                      
                $ ./a.out 
                Segmentation fault
                $ 
                • Re: C: pristup ku znakom z retazca 20.03.2012 | 01:31
                  Avatar m4jkl   Používateľ
                  to s tym warningom je zaujimave, nevedel som to. pouzivam iba klasicke -Wall -Wextra a v nich to -Wwrite-strings chyba :)

                  ok, teraz by bolo dobre definovat "uplne spravne" :) povodny dotaz nehovoril nic o zapise do toho stringu, mal sa iba vypisovat. v tomto pripade, ked je "linuxos" v datovom (textovom? podla size) segmente, tak do toho asi len tak zapisovat nepojde. ale s tym sa pocita, stale na tom postupe nevidim nic zle :)
                  • Re: C: pristup ku znakom z retazca 20.03.2012 | 09:29
                    Avatar Fridolín Pokorný Fedora 21  Používateľ
                    Tym uplne degradujes modifikator const - const char * vyjadruje, ze ukazatel ukazuje na data, ktore su nemodifikovatelne a v tomto pripade ten retazovy literal skutocne je nemodifikovatelny. Toto je skor ucebnicovy priklad, ale vo vacsom programe ti to moze zachranit par vlasov a naviac to sprehladnuje citelnost programu.
                    • Re: C: pristup ku znakom z retazca 20.03.2012 | 09:56
                      johnny   Návštevník
                      Pár vlasov a možno aj šediny :D
            • Re: C: pristup ku znakom z retazca 20.03.2012 | 00:42
              Avatar Fridolín Pokorný Fedora 21  Používateľ
              Mimochodom retazec nie je na zasobniku. Na zasobniku je len ukazatel nan.
              • Re: C: pristup ku znakom z retazca 20.03.2012 | 01:38
                Avatar m4jkl   Používateľ
                to patrilo k tomuto:
                char retazec[8];

                tu si myslim, ze to na zasobniku bude.
                • Re: C: pristup ku znakom z retazca 20.03.2012 | 09:29
                  Avatar Fridolín Pokorný Fedora 21  Používateľ
                  V tom pripade ano.