reklama
Aktuality  |  Články  |  Recenze
Doporučení  |  Diskuze
Grafické karty a hry  |  Procesory
Storage a RAM
Monitory  |  Ostatní
Akumulátory, EV
Robotika, AI
Průzkum vesmíru
Digimanie  |  TV Freak  |  Svět mobilně

scanf v C

kanabis (254)|30.10.2011 19:54
zdravím, snažím se udělat něco málo v C a nějak se mi to nedaří.
[CODE]
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 [CODE]Napište text poznámky
dddsa
Poznámka: '0[/CODE]
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

[SPOILER][CODE]//
// main.c
// uber app
//
// Created by Kamenitxan on 21.07.11.
// Copyright 2011 Kamenitxan. All rights reserved.
//

#include

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;
}

[/CODE][/SPOILER]
gabera (64)|30.10.2011 20:52
[quote=kanabis;479520]

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?
[/quote]

Snažíš se načíst text do celočíselné proměnné "poz".
kanabis (254)|30.10.2011 20:57
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.
Salamander (6177)|30.10.2011 21:02
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 :D
Dojigiri (1629)|30.10.2011 22:17
Zkus tohle:

[code]char poz[150];
printf("Napište text poznámky \n");
scanf("%s", poz);
printf("Poznámka: '%s", poz);[/code]

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:
[code]gets(poz);[/code]

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:

[code] char poz[150];
printf("Napište text poznámky \n");
int i = 0;
do {
poz=getchar();
} while ((poz != '\n') && (poz != '\r') && (++i < 150));
poz = 0;
printf("Poznámka: '%s'", poz);[/code]

(osobně bych to ovšem řešil použitím C++ a čtení do std::string ze streamu std::cin :turtle )
kanabis (254)|31.10.2011 06:59
Už to funguje. Dík
Bezpečnost ale zatím opravdu moc neřeším :)