Taulukon käsittely

eli olen tehnyt yhtä harjoitus tehtävää
missä pitää vaihtaa kahden taulukon sisältöjä.
Olen tehnyt seuraavan koodin pätkän mikä ei toimi.
Joten pientä vinkkiä kyseiseen. Mikä pitäisi olla
lopetusehto whilessä?

int main(void)
{
   char t1[]="3410";
   char t2[]="0220";
   swap(t1,t2);
   
   
   return 0;
}

int swap(short *a,short *b)
{
   int apu,apu2,i=0;
   while(*a != 0)
   {
      *a = apu;
      *b = apu2;
      *b = apu;
      *a = apu2;
      a ;
      b ;
      i ;
   }
   return 0;
}
12722
Äänestä

Muut lukivat myös

Vastaukset 12

Vanhimmat

En kerro suoraa ratkaisua, heitän sen sijaan muutaman kommentin.

swap() -funktion logiikka vähän tökkii..

Ensinnäkin, char on kahdeksanbittinen, short kuusitoistabittinen kokonaisluku.

Yleensä ottaen myös taulukon koko pitäisi mennä parametrinä funktiolle, tässä tapauksessa nollaan vertailu sattumoisin toimii, koska kyseessä on char-taulukko, joka tuolla tavoin esiteltynä loppuu nollamerkkiin.

*a ei ole koskaan nolla (se näyttää osoitteen, ei muuttujan arvoa)

Kahden muuttujan (x, y) swappayksessä tarvitaan yksi ylimääräinen muuttuja:
tmp = x
x = y
y = tmp

Mihin tarvitset i:tä?

Äänestä

#include

void swap(char *a,char *b,unsigned int length);

int main(void)
{
char t1[]="3410";
char t2[]="0220";
swap(t1,t2,strlen(t1));
printf("%s %s",t1,t2);
return 0;
}

void swap(char *a,char *b,unsigned int length)
{
   char tmp;
   int i;

   for(i=0;i

Äänestä
  • mut tos ratkasus pitää kummanki taulukon olla saman pitusia.. eiks strcpy olis parempi ratkasu ku toi for lause..

    Äänestä

  • no joo kirjoitti:

    mut tos ratkasus pitää kummanki taulukon olla saman pitusia.. eiks strcpy olis parempi ratkasu ku toi for lause..

    Kun kerran c :lla teet niin ehkä kannattaa tehdä suoraan:

    #include
    std::swap_ranges(&t1[0], &t1[4], &t2[0]);

    Mutta tietenkin harjoituksena tuosta ei paljoa ole apua ;)

    Äänestä

  • no joo kirjoitti:

    mut tos ratkasus pitää kummanki taulukon olla saman pitusia.. eiks strcpy olis parempi ratkasu ku toi for lause..

    No overflow checking is performed when strings are copied or appended.The behavior of strcpy is undefined if the source and destination strings overlap.

    mitäs jos kopioi lyhyempään merkkijonoon pitemmän?
    esm:
    t1[]="012";
    t2[]="13789074";

    strcpy(tmp,t1);
    strcpy(t1,t2); // taitaa mennä muutama merkki yli?
    strcpy(t2,tmp);

    ?
    ?
    ?
    saatan tietysti olla väärässä..

    tuossa alkuperäsessä jonot on yhtäpitkät EIKÄ siinä kysellä mitään eri pituuksista yms.

    Äänestä

  • TSwxiGH kirjoitti:

    No overflow checking is performed when strings are copied or appended.The behavior of strcpy is undefined if the source and destination strings overlap.

    mitäs jos kopioi lyhyempään merkkijonoon pitemmän?
    esm:
    t1[]="012";
    t2[]="13789074";

    strcpy(tmp,t1);
    strcpy(t1,t2); // taitaa mennä muutama merkki yli?
    strcpy(t2,tmp);

    ?
    ?
    ?
    saatan tietysti olla väärässä..

    tuossa alkuperäsessä jonot on yhtäpitkät EIKÄ siinä kysellä mitään eri pituuksista yms.

    mut silti se käy helpommin strcpy:llä ku for lausekkeella vaik olis yhtä pitkät nyt täs tehtäväs..

    Äänestä

  • niinnininin kirjoitti:

    mut silti se käy helpommin strcpy:llä ku for lausekkeella vaik olis yhtä pitkät nyt täs tehtäväs..

    Joo mutta kyseessä oli _taulukon_ kopiointi, eikä merkkijonon. Erona on, että tuo merkkijono päättyy NUL-merkkiin. strcpy() huomioi tuon mutta, jos pistät sille taulukon, jota ei ole päätetty niin käy huonosti. For-looppi on siis tässä tapauksessa parempi ratkaisu.

    Äänestä

  • *BSD kirjoitti:

    Joo mutta kyseessä oli _taulukon_ kopiointi, eikä merkkijonon. Erona on, että tuo merkkijono päättyy NUL-merkkiin. strcpy() huomioi tuon mutta, jos pistät sille taulukon, jota ei ole päätetty niin käy huonosti. For-looppi on siis tässä tapauksessa parempi ratkaisu.

    no mites ois memcpy tohon taulukoiden kopioimiseen..

    Äänestä

  • niininiiinn kirjoitti:

    no mites ois memcpy tohon taulukoiden kopioimiseen..

    Jeps, se on ok. Tosin helpompi se on kuitenkin
    tehdä std::swap_ranges()-funktiolla, jonka tuossa aikaisemmin esitin :p

    No kukin tavallaan...

    Äänestä

Sen toimimaan kun vaihdoin shortien tilalle
char. Kiitos hyvistä vinkeistä.

Äänestä
  • vielä apu muuttujat vasemmalle puolelle.

    Äänestä

Onko strcpy , jokin kopiointi funktio?
Siis sellainen valmis juttu.
Ja voisiko joku kertoa miten tämä tehtäisiin
pointerilla... siis kun siitähän puhutaan,
mutta kun ei ole oikein tietoa asiasta.

Äänestä

Kommentoi aloitusta


c++ kirjoitti:

eli olen tehnyt yhtä harjoitus tehtävää
missä pitää vaihtaa kahden taulukon sisältöjä.
Olen tehnyt seuraavan koodin pätkän mikä ei toimi.
Joten pientä vinkkiä kyseiseen. Mikä pitäisi olla
lopetusehto whilessä?

int main(void)
{
   char t1[]="3410";
   char t2[]="0220";
   swap(t1,t2);
   
   
   return 0;
}

int swap(short *a,short *b)
{
   int apu,apu2,i=0;
   while(*a != 0)
   {
      *a = apu;
      *b = apu2;
      *b = apu;
      *a = apu2;
      a ;
      b ;
      i ;
   }
   return 0;
}

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu