Mi lehet a hiba a 2dimenziós tömbömben? (C nyelv) Forráskód lent!
Azt szeretném megcsinálni hogy minden egyes "sorba" új szavakat írok be, majd kiiratom a szavakat külön sorba, de ez nem sikerül valamiért.
#include <stdio.h>
#include <stdlib.h>
#define MAX 40
int main(){
int i,j;
char cim[4][MAX];
for(j=0;j<4;j++){
while((cim[j][i++]=getchar())!='\n'){
cim[j][i]='\0';}
}
for(j=0;j<4;j++){
printf("%s\n", cim[j]);
}
system("pause");
}
Nem néztem át teljesen, de már az elv is rossz!
while((cim[j][i++]=getchar())!='\n'){
cim[j][i]='\0';}
}
gondold végig mit csinál ez a programrész. A getchar() fv. nem tudom beolvassa-e azonnal a karaktert, ha lenyomod a billentyűt. Ha nem akkor ez az egyik hiba. A másik megtalálását rád bízom.
Hát én nem tudom..azt a részt így vettük órán.
Ha tudnám mi a hiba akkor nem kérdezem itt meg.
"Nem néztem át teljesen, de már az elv is rossz!"
Most lehetne ezen vitatkozni hogy rossz elv stb. Van benne igazság. Viszont tömör kód, c-s programozókra jellemzően.
"A getchar() fv. nem tudom beolvassa-e azonnal a karaktert, ha lenyomod a billentyűt. Ha nem akkor ez az egyik hiba. "
Ez most nem játszik szerepet.
while(cim[j][i++]=getchar())!='\n') Mit csinál? Addig ismétli amíg igaz a feltétel.
Először (cim[j][i++]=getchar()) értékadás történik.
j-edik sor i-edik karakterére értékadás után i++.
Ez az értéket összehasonlítjása != '\n' újsor karakterrel.
Ha igaz végrehajtja a ciklusmagot
cim[j][i]='\0' mit csinál?
A következő elemet '\0' karakterre azaz sorvégjelre állítja be, utána while((cim[j][i++]=getchar())!='\n') ezt a beállított értéket felülírja mindig amíg a while igaz ha hamis akkor nem, ezért
a cim[j][i]='\0'; felesleges semmi hatása nincs azon kívül hogy overhead.
Megsúgom:
for(j=0;j<4;j++){
i=0;
while((cim[j][i++]=getchar())!='\n');
cim[j][i-1]='\0';
}
"A Másik hiba pedig, hogy az első verziónál ha üres stringet adsz meg bármelyik sornál, jó eséllyel elszáll. Általában zavaróbb, mint hogy feleslegesen fut le néhány értékadás."
Azt hogy mekkora eséllyel az függ a fordítóprogramitól az operációs rendszertől,lényegébe a char tömb inicializálatlan tartalmától. Szignifikánsan nem más eséllyel mintha nem üres string-et ad meg. Hisz ha átgondoltad volna vagy elolvastad volna, amit írtam, hogy a cim[j][i]='\0' ciklusmag csupán overhead, a (cim[j][i++]=getchar()) azt mindig felülírja így lényegébe nem is rak végjelet sose.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!