C virhetilanteita

Mureakuha

Loikkaa: valikkoon, hakuun

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.

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;

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() 
 
Henkilökohtaiset työkalut