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ě

C výpis znaku z pole po jednom

kanabis (254)|18.1.2012 18:45
Zdravím,
snažím se napsat program, který vypíše 1 znak z pole, udělá pauzu a tak se to opakuje do vypsání celého pole. Vždy se ale celý text vypíše najedou. Nevíte co s tím? Dík
Zdroják je tu. Problém je někde ve funkci druha()
[SPOILER][CODE]//
// main.c
// retezec1
//
// Created by Pavel Tomáš on 10.01.12.
// Copyright 2012 __MyCompanyName__. All rights reserved.
//

#include
#include
#include

#define MAX 25

void prvni (void)
{
int a;

for (a = 97; a <= 122; a++) {
printf("%c", a);
}
printf("\n");
for (a = 65; a <= 90; a++) {
printf("%c", a);
}
printf("\n");
}

void cekej(void)
{
clock_t stav;
stav = 20000 + clock();
while (stav > clock());
}

void druha(void)
{
char retezec[MAX], slon;
int krok;

printf("Zadaj text do dalnopisu\n");
scanf("%s", &retezec);
printf("Odesílám dálopis\n");
for (krok = 0; krok < MAX; krok++) { // TADY to nějak nefunguje
slon = retezec[krok];
printf("%c", slon);
cekej();
}
}

int main (int argc, const char * argv[])
{

// insert code here...
printf("Řetězce!\n");

// prvni();
druha();
return 0;
}

[/CODE][/SPOILER]
gabera (64)|18.1.2012 19:51
Oprava funkce druha:


void druha(void)
{
char retezec[MAX], slon;
int krok;
int delka; // *** doplněno

printf("Zadaj text do dalnopisu\n");
scanf("%s", retezec); // *** původně: &retezec);
printf("Odesílám dálopis\n");
delka = strlen(retezec); // *** doplněno
for (krok = 0; krok < delka; krok++); { // vypustit středník !//*** původně: MAX; krok++) {// TADY to nějak nefunguje
slon = retezec[krok];
printf("%c", slon);
cekej();
}
}

Edit: Pardon, omylem jsem mezi instrukci "for(..... )" a závorku "}" napsal středník. Je nutno jej vypustit.
kanabis (254)|18.1.2012 20:26
Bohužel nic. Chová se to stále stejně.

Když si na printf("%c", slon); dám breakpoint, tak vidím, že se každý krok mění hodnota slonu správně. Vypíše se to ale až potom, co se dokončí celé for. Také se mi zdá, že to nejdříve čeká a až pak vypisuje, což je taky divné.
Suprak (408)|18.1.2012 20:54
Nějak takto?
[code]
#include
#include
#include
int main()
{
char retezec[]="";
int krok;
int delka;

printf("Zadaj text do dalnopisu\n");
scanf("%s", retezec);
printf("Odesilam dalopis\n");
delka = strlen(retezec);
for (krok = 0; krok < delka; krok++)
{
printf("%c", retezec[krok]);
Sleep(300);
}
getchar();
getchar();
}
[/code]
gabera (64)|18.1.2012 21:07
[quote=Suprak;490221]Nějak takto?
[code]

int main()
{
char retezec[]="";
.....

}
[/code][/quote]


Nutno definovat delku řetězce, např.:

char retezec[25]="";
Salamander (6177)|18.1.2012 21:16
no, tak pozde, nevadi ... ale jenom malou radu, ze takhle to neni uplne nejlepsi napad delat ;)
kanabis (254)|18.1.2012 21:22
Vaše úpravy zavedeny ale stále nic. Zajímevé je, že když při tisku znaku odřadkuju (printf("%c\n", slon);) tak to funguje, tak jak má. Já bych to ale potřeboval na jeden řádek. Zdá se, že kod bude tedy víceméně dobře a chyba je někde na úrovni, na které zatím opravdu nejsem.

Speciální poznámka pro Suprak: windows.h tu nemám. Nejsem na windows. To má ale vliv jen na Sleep(300);, že?

Mometálně mám tedy kod tento.
[code]void druha(void)
{
char retezec[MAX]="", slon;
int krok, delka;

printf("Zadaj text do dalnopisu\n");
scanf("%s", retezec);
printf("Odesílám dálopis\n");
delka = strlen(retezec);
for (krok = 0; krok < delka; krok++) {
slon = retezec[krok];
printf("%c", slon);
cekej();
}
}[/code]

Edit: Salamander - jde o pevnou alokaci? Až to bude fungovat, tak to přepíšu na dynamickou :)
Salamander (6177)|18.1.2012 21:31
jo, pevna alokace a pohodlnej, ale ne uplne bezproblemovej scanf
kanabis (254)|18.1.2012 21:39
A čím ho nahradit? Mám tu C učebnici od Pavla Herouta a zatím jsem tam na nic lepšího nenarazil. A v tomto kodu funguje dobře. Když se podívám na obsah pole, tak to je dobře zapsané.
Suprak (408)|18.1.2012 21:39
Ano, pouze Sleep. Multiplatformost končí tam kde začíná windows :D
gabera (64)|18.1.2012 21:47
[quote=kanabis;490228]Vaše úpravy zavedeny ale stále nic. Zajímevé je, že když při tisku znaku odřadkuju (printf("%c\n", slon);) tak to funguje, tak jak má. Já bych to ale potřeboval na jeden řádek.
.....

Nejsem na windows.
.....
[/quote]


Ve Windows XP poslední verze kódu vypisuje text na jeden řádek (zkusil jsem předklad a spuštění). Na jaké platformě to děláš ty?
Salamander (6177)|18.1.2012 22:03
[quote=kanabis;490234]A čím ho nahradit? Mám tu C učebnici od Pavla Herouta a zatím jsem tam na nic lepšího nenarazil. A v tomto kodu funguje dobře. Když se podívám na obsah pole, tak to je dobře zapsané.[/quote]

tak da se to resit treba getc (wgetc), s testovanim EOF, pak je i o dost jednodussi dynamicka alokace toho pole :)
mech13 (5526)|18.1.2012 22:56
rekl bych ze se to hromadi v nejakem bufferu a optimalizacemi to ceka na vic veci k vypisu...

vyzkousej neco na tento styl (nezkousel jsem, jen me napadlo): fflush(stdout); http://www.cplusplus.com/reference/clibrary/cstdio/fflush/

Pripadne prenastavit kompilator aby nebufferoval
kanabis (254)|20.1.2012 10:58
Tak mech13 na to přišel. Dík všem za pomoc
[code]for (krok = 0; krok < delka; krok++) {
printf("%c", retezec[krok]);
fflush(stdout);
cekej();
[/code]