Favicon Svetmobilne.cz  Svět mobilně Favicon Svetaudia.cz  Svět audia Favicon TVFreak.cz  TV Freak   Fórum Favicon Digimanie.cz  Digimanie   Fórum   Galerie
Zobrazené výsledky: 1 až 6 z 6

Téma: scanf v C

  1. #1
    Pravidelný diskutér Avatar uživatele kanabis
    Registrace
    Aug 2008
    Příspěvků
    256

    zdravím, snažím se udělat něco málo v C a nějak se mi to nedaří.
    Kód:
                    int poz;
                    printf("Napište text poznámky \n");
                   // printf("NEFUNKCNI!!!");
                    
                    scanf("%d", &poz);
                    printf("Poznámka: '%d", poz);
    a když to pustím tak z toho vyleze
    Kód:
    Napište text poznámky 
    dddsa
    Poznámka: '0
    Nevíte co s tím? Dělám to v Xcode 4 na Lionu a pouštím v terminálu. To by na to ale vliv mít nemělo. Přikládám ješte celý zdroják. Zatím to ale vůbec nefunguje
    Dík


    Kód:
    //
    //  main.c
    //  uber app
    //
    //  Created by Kamenitxan on 21.07.11.
    //  Copyright 2011 Kamenitxan. All rights reserved.
    //
    
    #include <stdio.h>
    
    int main (int argc, const char * argv[])
    {
        FILE *db; 
    
    
        printf("Welcome to Uber GTD!\n\n");
        printf("| Autor: Tomáš Pavel\n| Verze: 0.1\n| Datum: 21.7.2011\n\n");
        
        printf("N - Přidat poznámku\n");
        printf("Z - Zobrazit poznámky\n");
        printf("S - Smazat poznámky\n\n");
            
        
        switch (getchar()) {
            case 'n':
                { 
                    db = fopen("db.txt", "w");
                    int poz;
                    printf("Napište text poznámky \n");
                   // printf("NEFUNKCNI!!!");
                    
                    scanf("%d", &poz);
                    printf("Poznámka: '%d", poz);
                    
                    fclose(db);;
                    return 0;
                }
            
            case 'z':
            {
                int c;
                if ((db = fopen("db.txt", "r")) == NULL) {
                    printf("Databázový soubor se nepodařílo otevřít.");
                return 1;
                }
                
                while ((c = getc(db)) != EOF)
                    putchar(c);
        
                fclose(db);
                printf("\n\n");
            }
            
            case 's':
            {
                printf("Zadejte číslo poznámky, kterou chcete smazat: ");
                printf("NEFUNKCNI!!!");
                
                db = fopen("db.txt", "w");
                fclose(db);
                break;
            }
                
            default:
                break;
        }
        
        return 0;
    }
    Odpovídat lze po přihlášení

  2. #2
    Občasný diskutér
    Registrace
    Jul 2009
    Příspěvků
    68

    Citace Původně odesláno od kanabis Zobrazit příspěvek

    int poz;
    printf("Napište text poznámky \n");
    // printf("NEFUNKCNI!!!");

    scanf("%d", &poz);
    printf("Poznámka: '%d", poz);[/CODE]

    a když to pustím tak z toho vyleze


    Napište text poznámky
    dddsa
    Poznámka: '0

    Nevíte co s tím?
    Snažíš se načíst text do celočíselné proměnné "poz".
    Odpovídat lze po přihlášení



  3. #3
    Pravidelný diskutér Avatar uživatele kanabis
    Registrace
    Aug 2008
    Příspěvků
    256

    A kam to mám ukládat Zatím neumím vůbec nic Mám tu C učebnici ale není tu ukázka s textem, jen s čísly.
    Odpovídat lze po přihlášení

  4. #4
    Starousedlík SHW Avatar uživatele Salamander
    Registrace
    May 2006
    Příspěvků
    6,259

    http://www.sallyx.org/sally/c/c07.php

    viz ta tabulka, a projdi si to cely, je to vybornej tutorial pro zacatecniky ... jinak odpoved na tvoji otazku je %s
    Odpovídat lze po přihlášení

  5. #5
    Starousedlík SHW Avatar uživatele Dojigiri
    Registrace
    Jun 2008
    Příspěvků
    1,636

    Zkus tohle:

    Kód:
    char poz[150];
    printf("Napište text poznámky \n");
    scanf("%s", poz);
    printf("Poznámka: '%s", poz);
    Ovšem se scanf je problém, že skončí na mezeře, takže dostaneš jenom první slovo před mezerou.
    Šlo by volat v cyklu, ale zase nevíš dopředu kolik bude slov.

    Celej řetězec s mezerema lze přečíst použitím gets() místo scanf:
    Kód:
    gets(poz);
    Problémem obou těchhle funkcí je, že může dojít k přetečení bufferu (když zadáš delší string než kolik je velkej buffer, tj. v tomhle případě 150) a s těmahle funkcema to nelze nijak ošetřit (= jsou nebezpečný a podobně špatně napsaný programy jsou často zneužívaný viry).


    Lze to řešit různými způsoby, např. takhle:

    Kód:
    	char poz[150];
    	printf("Napište text poznámky \n");
    	int i = 0;
    	do {
    		poz[i]=getchar();
    	} while ((poz[i] != '\n') && (poz[i] != '\r') && (++i < 150));
    	poz[i] = 0;
    	printf("Poznámka: '%s'", poz);
    (osobně bych to ovšem řešil použitím C++ a čtení do std::string ze streamu std::cin )
    Odpovídat lze po přihlášení

  6. #6
    Pravidelný diskutér Avatar uživatele kanabis
    Registrace
    Aug 2008
    Příspěvků
    256

    Už to funguje. Dík
    Bezpečnost ale zatím opravdu moc neřeším
    Odpovídat lze po přihlášení