Keresés

Új hozzászólás Aktív témák

  • Hani

    aktív tag

    bucsupeti, alapz@j, buherton:

    Köszönöm az infókat. Kipróbálom őket, aztán kiderül - egyelőre mondjuk csak egyszerű, banális kis jószágokat gyártok, amihez akár egy online fordító is oké, csak a lépésenkénti futtatást / debugot hiányolom különösebben, hogy jobban lássam, hogy éppen mi történik.

  • Hani

    aktív tag

    válasz Jester01 #4921 üzenetére

    Köszönöm, megpróbálom akkor ezek szerint.

    Még egy kérdés: ha normálisan akar C-ben programozni az ember, akkor milyen programot érdemes használni? Eddig a notepad -> notepad++ -> Eclipse+Cygwin utat jártam be, de mindegyiknek megvoltak a maga bajai. Van olyan keretrendszer, ami különösen ajánlott, vagy bármelyik jó, csak szokjak hozzá a sajátosságaihoz?

  • Hani

    aktív tag

    válasz Hani #4919 üzenetére

    (A scanf("%d", i); igazából scanf("%d", &i); valamiért most lemaradt az &. )

  • Hani

    aktív tag

    Sziasztok,

    újra gondom van, pontosabban egy régi dolog jött fel újra.
    Egyszerű a feladat: 1 és 5 közötti számokat kell beolvasnom. Azt gondoltam, hogy megoldom ezzel:

    #include <stdio.h>


    int main() {

    int i;

    do
    {
    printf("Adjon meg egy szamot 1 es 5 kozott:\n");
    scanf("%d", i);
    fflush(stdin);

    if ((1>i) || (5<i)) printf("A megadott adat nem 1 es 5 kozotti szam.\n");

    } while ((1>i) || (5<i));

    printf("A megadott szam: %d\n", i);

    return 0;
    }

    A program megy, ha mondjuk 4-et ütök be. Működik akkor is, ha mondjuk 44-et ütök: kiírja, hogy hibás és újra kéri. De ha nem számot ütök be, hanem mondjuk egy k betűt, akkor végtelen ciklusban elkezdi kiírni, hogy "Adjon meg egy szamot 1 es 5 kozott:
    A megadott adat nem 1 es 5 kozotti szam." ,

    Mindezt beolvasás nélkül, hiába az fflush.

    Kérdés, hogy mit nézek el? Hogyan kell normálisan bekérni 1 és 5 közötti számokat?

  • Hani

    aktív tag

    válasz Jester01 #4906 üzenetére

    Köszönöm ezt is.

    2. Akkor ezek szerint gyakorlati haszna is van.. akkor mindenképpen odaírom.

    A scanf-nél mondjuk ha az lenne a feladat, hogy csak számokat olvashat be, akkor mit kéne tennem? Vagy ne használjam a scanf-et, hanem mondjuk while-lal addig kérjem be a dolgokat, amíg megfelelő inputot nem kapok?

    mallocnak utánaolvasok azonnal.

  • Hani

    aktív tag

    válasz buherton #4904 üzenetére

    Wow, ez gyors volt.
    Az 1.-nél hasonló gondolatra jutottam én is, aztán negyed óra anyázás után szétszedtem külön átmeneti változókra, de azért izgatja a fantáziámat... ami könyvet meg fellapoztam, mind csak az egyszerűbb részeket mutogatta, ++i, i++, aztán annyi.

    2. Pöpec. Megcsinálni szívesen megcsinálom, ha így szokás, csak zavar, ha nem tudom az okát.

    3. Mivel lehet akkor jól beolvasni a usertől mindenfélét? Illetve ha már itt vagyunk, akkor eszembe jut a getchar is, hogy a Jóistennek sem sikerül beolvastatnom vele egy Entert vagy Escape-et (mondjuk hogy arra kilépjen) - q-t igen, vagy más szép karaktert, de ezeket nem szereti.

    4. Volt ennek valami furább verziója, talán int *const p / int const* p / const int* p / int const * const p, de ez is közben tisztázódik az órajárásos megoldással, szép lesz ez.

    5. Kár, pedig szép lenne egy beépített szűrő

    6. Utánakeresek akkor.

  • Hani

    aktív tag

    válasz Hani #4903 üzenetére

    Az előző végén persze nem figyeltem és átváltoztatta nekem a [ i ] -jeimet (i)-re meg jó kis dőlt betűre, szóval az utolsó rész még egyszer:

    static char copystr[255];
    strcpy(copystr, string);

    while(string[ i ] !='\0')
    {
    //Csak a kisbetuket valtoztatjuk, a tobbi marad
    if ( string[ i ] >= 'a' && string[ i ] <= 'z' )
    copystr[ i ] = string[ i ]-32;
    i++;
    }
    return copystr;
    }

    illetve

    char* upper_string3(char str[])
    {
    int i=0;

    while(str[ i ] !='\0')
    {
    if ( str[ i ] >= 'a' && str[ i ] <= 'z' )
    str[ i ] = str[ i ]-32;
    i++;
    }
    return str;
    }

  • Hani

    aktív tag

    Uraim!

    El vagyok keseredve.
    Jó 10 év után újra elővettem a C-t, gyorsan átfutottam pár nap alatt az egészet és arra kellett rájönnöm, hogy valahol elhagytam az agyam, mert akkoriban még egész jól ment, most meg alapvető dolgokat nem értek. Persze az is lehet, hogy mindig is hülye voltam, csak akkoriban nem jöttek elő ezek a kérdések... nem tudom, mindenesetre segítséget kérek, mert magamtól nem megy és a google sem a barátom ezekben (és még egy rakás másban sem, de most ezek jutottak hirtelen eszembe):

    1. Van egy olyanom, hogy

    int a = 1, b = 1, d = 1;

    printf("%d, %d, %d", ++a + ++a + a++, a++ + ++b, ++d + d++ + a++);

    Kérdés, hogy mit ír ki? A megoldás: 15, 4, 5. De miért?

    2. Legyen egy long int-em:

    long int li = 12345L;
    Miért kell nekem az 12345 végére az L betű? A fordítónak jelzem, ha nem lenne elég, hogy odaírom, hogy long? Saját magamnak jelzem, nehogy elfelejtsem a típust? Egyéb?

    3. scanf és az ő filterezése.
    Elvileg lehet olyat, hogy scanf("%[0-9a-fA-F]", &akarmi), hogy csak számokat és a-f / A-F karaktereket olvashasson be. Nekem mégsem megy, sem a komplementer változata ^0-9... verzióban. Mit rontok el?

    4. Pointeres változók.
    Miben különbözik az int* i és az int *i ? Van egyáltalán bármi? Mondjuk ezt közben pont megtaláltam, miközben írtam, úgyhogy sztornó (a válasz itt)

    5. enum-ok.
    Legyen két felsorolásom:
    enum birds {SPARROW, PEACOCK=5, PARROT};
    enum animals {TIGER = 8, LION, RABBIT, ZEBRA};

    enum birds m;
    m = LION; //Ezt elvileg nem lehetne, de mégis lehet. Miért?
    Szóval én eddig azt hittem, hogy ha van egy enum típusú változóm, akkor azokat az értékeket adhatom neki, amik a felsorolásban szerepelnek, de úgy tűnik, mégsem. Valahol elvesztettem a fonalat.

    +1. Nagybetűsíteni szeretnék egy stringet egy függvénnyel: megkapni paraméterben és visszaadni a nagybetűs verzióját. Erre több megoldás is lenne, de valahogy egyik sem az igazi:

    - valamiért nem viszi a sima strupr()-t, ráadásul az az eredeti változót változtatja meg, ami nem oké. Csinálnék helyette egy másikat, de vagy kell hozzá globális változó, vagy nem ideális a memóriafelhasználás, vagy megváltoztatja az is az eredeti paramétert... Hogy kéne ezt normálisan?
    Amikkel próbálkoztam, azok ezek:

    void upper_string(char *string)
    //Ez már megy, de ez is megváltoztatja az eredeti paramétert, ugye.
    {
    while(*string)
    {
    if ( *string >= 'a' && *string <= 'z' )
    *string = *string - 32;
    string++;
    }
    }

    Lehetne olyan, hogy:

    char* upper_string2(const char *string)
    {
    int i=0;

    /*
    Namármost. Vagy definiálok egy globális char copystr[]=""; változót és annak a címét használom,
    vagy definiálunk itt egy olyat, hogy char copystr[(strlen(string)]=""; , ami viszont lokális változó,
    és nem jó ötlet lokális változó címét visszaadni a függvényen kívülre; vagy csinálunk egy static változót
    itt helyben, aminek viszont méretet kell adni, amit nem lehet csak úgy strlen-nel. Én ezt az utóbbit választom, mondjuk 255-ös hosszal, de hát ez is milyen már.
    */

    static char copystr[255]; //Lehetne ez [65535] is akár.
    strcpy(copystr, string);

    while(string [ i]!='\0')
    {
    //Csak a kisbetuket valtoztatjuk, a tobbi marad
    if ( string(i) >= 'a' && string(i) <= 'z' )
    copystr(i) = string(i)-32;
    i++;
    }
    return copystr;
    }

    Vagy lehetne simán ez is, de ez is megváltoztatja az eredeti változómat:

    char* upper_string3(char str[])
    {
    int i=0;

    while(str(i) !='\0')
    {
    if ( str(i) >= 'a' && str(i) <= 'z' )
    str(i) = str(i)-32;
    i++;
    }
    return str;
    }

    Szóval van baj, nem tudom, hogy mikorra állnak vissza a fejemben a dolgok, de elkelne egy kis segítség.

Új hozzászólás Aktív témák

Hirdetés