Mi a gond ezzel a kis C progival (alapok)?
A következő kis progit szeretném megírni, de az adatbekérésnél elakadtam. 2 helyen is nem jól működik, de képtelen vagyok rájönni, hogy miért.
Annyi biztos, hogy az első adatbekérésnél nem számolja a karaktereket. Míg a 3. adatbekérésnél a betűkkel van baja. (Ha átírom számokat beolvasóra, akkor tökéletes.)
//Betűk keresése a tömbből:
#include <stdio.h>
#include <math.h>
int main()
{
const int N=20;
int i, j, k, n;
char betu[n], szoveg[N];
printf("\nEz egy betuszamlalo program.");
printf("\n\nIrj be %d karakternyi, tetszoleges szoveget:\n\n",N);
for (i=0; i<=(N-1); i++) //1. adatbekérés - szöveg
{
scanf("%c",&szoveg[i]);
if (i == (15))
printf("\b\n\nKoszonom");
}
printf("\n\nHany betut keressek ki a szovegbol?\n"); //2. adatbekérés - dbszám
scanf("%d",&n);
for (j=0; j<=(n-1); j++) //3. adatbekérés - betűk
{
printf("\n\nKerem a(z) %d. keresett betut: ",j+1);
scanf("%d",&betu[j]);
}
printf("\n\n");
return 0;
}
C-ben nem tudsz ilyet beírni, hogy:
char akarmi[n];
Olyat tudsz beírni, hogy char akarmi[10]; a lényeg, hogy fordítási időben ismert legyen a mérete (konstans szerepelhet).
Ha dinamikusan akarsz tömböt foglalni, akkor:
#include <stdlib.h>
...
char* valami;
valami = malloc(sizeof(char)*hossz); //hossz a tömb hossza
if (valami == NULL) //nem sikerült lefoglalni
...
free(valami); //ha nincs rá szükséged.
A malloc-kal foglalhatsz memóriát, annyi bájtnyit, amennyit paraméterül átadsz. valami-t ezután ugyanúgy tudod indexelni és használni, mintha tömböd lenne. Annak, aki megkérdezné, hogy mi a fenének a sizeof(char), annak elmondom, hogy a rendszerek 90%-án a mérete 1 bájt, viszont a C szabvány ezt nem köti ki. Tehát elhagyható, ha nem akarunk platformfüggetlen kódot írni.
Azon kívül jó a program, bár még nagyon nem azt csinálja, amit gondolsz. Ötletek a hibakereséshez: a scanf egy szöveget olvas be, és enter után beírja a paraméterül átadott memóriacímre. Pl. azt írod be, hogy Almafa, majd ütsz egy entert, a memóriában ez lesz:
Almafa, majd lezárja egy 0-val a végét (null karakter, '\0'-val hivatkozhatsz rá, ascii-kódja: 00h).
Karaktert beolvasni az int getchar() függvénnyel tudsz, stdio.h-ban van deklarálva. Visszatérési értéke a beolvasott karakter ascii-kódja, ha nem tud karaktert beolvasni, EOF-ot (többnyire -1 az értéke) ad vissza.
int talalt = 0, i;
char keresett = /*a keresett karakter*/;
char* str; //a szöveg
for(i = 0; str[i]; i++)
if(str[i] == keresett) talalt++;
// talalt-ban van a betűk száma.
próbáld meg ezzel. Sokkal egyszerűbb :) A másik fele. Nem teszel lezáró '/0' a szoveg végére. Nekem a "n" változódnak nincs kezdeti értéke így az a sor, hogy char betu[n], szoveg[N]; nekem nem is fut le. Hogyha kézzel átírom a char tömbök méretét 20-ra akkor már elindul. De rögtön jön az első hiba. fflush(stdin)-t sehol nem használsz. [link] itt találsz egy csomó mintakódot ahol használják. Visual studio 2010 ultimattel forditottam.
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!