Kezdőoldal » Számítástechnika » Programozás » Mi lehet a hiba a 2dimenziós...

Mi lehet a hiba a 2dimenziós tömbömben? (C nyelv) Forráskód lent!

Figyelt kérdés

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");


}



#tömb #C nyelv #programozáz
2012. nov. 25. 00:13
 1/8 _Jessy_ ***** válasza:

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.

2012. nov. 25. 10:11
Hasznos számodra ez a válasz?
 2/8 A kérdező kommentje:

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.

2012. nov. 25. 13:59
 3/8 anonim ***** válasza:

"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';

}

2012. nov. 25. 16:05
Hasznos számodra ez a válasz?
 4/8 A kérdező kommentje:
Köszi! Így már jó. :)
2012. nov. 25. 16:22
 5/8 anonim ***** válasza:
Tudom hogy jó, szívesen. :)
2012. nov. 25. 16:52
Hasznos számodra ez a válasz?
 6/8 _Jessy_ ***** válasza:
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.
2012. nov. 25. 19:31
Hasznos számodra ez a válasz?
 7/8 anonim ***** válasza:

"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.

2012. nov. 26. 16:26
Hasznos számodra ez a válasz?
 8/8 _Jessy_ ***** válasza:
Ja igen, úgy is elszáll, ha nem üres a string, (figyelmetlen voltam én is) de szerintem erre azért illene rájönni egyedül is. Vagy legalább megpróbálni. Tapasztalat! Sokkal többet tanul az ember abból, ha kijavítja amit elszúrt, mintha megmondaná valaki a megoldást. Előbbi tovább tart, de megéri. :)
2012. nov. 26. 21:38
Hasznos számodra ez a válasz?

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!