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;
}
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;
}
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ä?
#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
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 ;)
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..
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..
Jeps, se on ok. Tosin helpompi se on kuitenkin
tehdä std::swap_ranges()-funktiolla, jonka tuossa aikaisemmin esitin :p
No kukin tavallaan...
Sen toimimaan kun vaihdoin shortien tilalle
char. Kiitos hyvistä vinkeistä.
vielä apu muuttujat vasemmalle puolelle.
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.