C virhetilanteita
Mureakuha
Tähän on listattu yleisimpiä virhetilanteita, joita tulee vastaan koodeissa. Kaikki kääntäjän antamat huomautukset on syytä käydä läpi, jolloin osa seuraavista jää pois.
[muokkaa]
Rakenteisiin liittyvät
- taulukon rajat muistetaan väärin
int taulu[10]; //taulu[0]...taulu[9] taulu[10] = 0; //Tai vieläkin yleisempi: for(i = 0 ; i <= 10 ; ++i) //pitäisi olla i < 10 taulu[i] = 0;
- muuttujia ei alusteta
char* pc; int count; strcpy(pc, "123"); while(count < 10)...
- silmukka ei pääty:
int count = 0; while(count < 10){ printf("Anna luku"); scanf("%d", &luvut[i]); }
- vertaillaan merkkijonoja == -operaattorilla
if(teksti == "Jotakin tekstiä") //strcmp()
- vertailussa käytetään yhtäsuuruuden (==) asemasta sijoitusta (=)
- -Wall-optiolla gcc varoittaa tästä ilmoituksella "suggest parentheses around assignment used as truth value", eli että sijoitus (x = y) jota käytetään totuusarvona, tulisi ympäröidä ylimääräisillä sulkumerkeillä osoittamaan että käyttö on tarkoituksenmukaista.
if(i = 1) //pitäisi olla == printf("Virhe");
- vääränlainen vertailulause
if(0 < a < 2) ... //pitäisi olla if(0 < a && a < 2) //edellinen tarkoittaa (0 < a) < 2 eli sulkujen sisältöä (tosi = 1/epätosi = 0) //verrataan arvoon 2 ja koko lauseke on siis aina totta jokaisella a:n arvolla
- break puuttuu switch:n case -lauseesta
switch(i){ case 1: printf("Jotakin"); case 2: //break puuttuu edellisestä, joten molemmat suoritetaan printf("Jotakin muuta"); }
- jako kokonaisluvuilla
double puoli = 1/2; //vähintään toinen täytyisi olla liukuluku
- ylimääräinen puolipiste
while(x < 10); ++x;
[muokkaa]
Funktioihin liittyvät
- unohdetaan esitellä funktiot
double x = exp(2); //Jos exp:iä ei ole esitelty //-> exp oletetaan palauttavan kokonaisluvun
- väärä muuttujan koko
double d; scanf("%f", &d); //Pitäisi olla "%lf"
- osoittimet ja referenssit:
int x; char text[64]; scanf("%d", x); //Pitäisi olla &x scanf("%s", &text); //Pitäisi olla pelkkä text
- unohdetaan kutsua malloc:n jälkeen free
- teksti ei pääty nul -merkkiin
char teksti[4] = "Moi!"; strcpy(tekstiin, teksti);
- konsolilta luku
printf("Anna luku: "); scanf("%d", &i); printf("Anna teksti: "); fgets(buffer, 8, stdin); //scanf on aiemmin jättänyt '\n' -merkin lukematta //-> buffer[0] = '\0'
- rivinpäättömerkki on ongelmallinen myös seuraavassa
char teksti[8]; fgets(buffer, 8, stdin); //jos käyttäjän antamien merkkien määrä on < 7 teksti[strlen(buffer) - 1] = '\0'; //-> '\n' halutaan pois //>= 7 tapaus on vaan jätetty huomioimatta
- feof väärässä paikassa
while(!feof(file)) { fgets(buffer, sizeof(buffer), file); fputs(line, stdout); //pitäisi olla ennen tätä funktiota }
- joukko muita funktioita
void main() //pitää olla C:n standardin mukaan int main() { fflush(stdin); //toiminta riippuu kääntäjästä, useimmiten ei toimi gets(); //ei rajoita luettavien merkkien määrää system("cls"); //ei toimi kuin MS:n komentorivillä system("pause"); //ei toimi kuin MS:n komentorivillä, korvaava getch()
