Scanf ve funkci – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Scanf ve funkci – C / C++ – Fórum – Programujte.comScanf ve funkci – C / C++ – Fórum – Programujte.com

 

Rostislav
~ Anonymní uživatel
3 příspěvky
8. 4. 2017   #1
-
0
-

Ahoj, jsem v programování dá se říct začátečník. Abych si procvičil programování, tak jsem si řekl, že si naprogramuji šibenici. Ale setkal jsem se tu s malým problémem(vyřešil jsem ho, že jsem to naprogramoval jinak, ale chci se zeptat, proč to dělá to co to dělá.

Tato funkce má od vás vzít písmeno a zkontrolovat jestli je v poli a když je, tak ho odkryje. Ale setkal jsem se tu s problémem. 

 Když program skočí do funkce, tak příkazem scanf("%c", &pismeno); po nás chce jedno písmeno. To zadám, zbytek funkce funguje dobře a provede se, ale když zavolám funkci znova příkazem z mainu, tak to vynechá příkaz scanf("%c", &pismeno); a nic to po mně nechce zadat, počítá to s minulou hodnotou. Až funkce běží po 3. tak to po mně chce hodnotu, ale když po 4. tak ne. Dělá to pořád dokola, každý druhý volání to vynechá.

V mainu volám funkci cyklem

do
	{
		skryto=Odkryti(slovo, skslovo, delkaslova, &chyba, &pokus);
	} while (skryto != 0);

char Odkryti(char pole[],char skpole[], int delka, int *chyby, int *pokus) {     int skryto;     char pismeno= NULL;     printf("\n%d. pokus  Zadej pismeno:", *pokus);     scanf("%c", &pismeno); 

    ++*pokus;

    int g = 0;     for (int i = 0; i < delka; ++i)     {                  if (pole[i] == pismeno)         {             skpole[i] = pismeno;             ++g;         }     }

    if (g == 0)         ++*chyby;

    int y = 0;     for (int i = 0; i < delka; ++i)     {         if ((int)skpole[i] == 95)             ++y;     }              


    for (int i = 0; i < delka; ++i)         printf("%c", skpole[i]);     printf("\n");


         printf("Pocet chyb:!%d\n\n",*chyby, *pokus);

    return y;


}

Nahlásit jako SPAM
IP: 109.238.35.–
Rostislav
~ Anonymní uživatel
3 příspěvky
8. 4. 2017   #2
-
0
-

#1 Rostislav
Omlouvám se, zdrojový kód funkce jsem vložil nějak blbě.

char Odkryti(char pole[],char skpole[], int delka, int *chyby, int *pokus)
{
	int skryto;
	char pismeno= NULL;
	printf("\n%d. pokus  Zadej pismeno:", *pokus);
	scanf("%c", &pismeno); 

	++*pokus;

	int g = 0;
	for (int i = 0; i < delka; ++i)
	{
		
		if (pole[i] == pismeno)
		{
			skpole[i] = pismeno;
			++g;
		}
	}

	if (g == 0)
		++*chyby;

	int y = 0;
	for (int i = 0; i < delka; ++i)
	{
		if ((int)skpole[i] == 95)
			++y;
	}
	
		


	for (int i = 0; i < delka; ++i)
		printf("%c", skpole[i]);
	printf("\n");


	
	printf("Pocet chyb:!%d\n\n",*chyby, *pokus);

	return y;


}
Nahlásit jako SPAM
IP: 109.238.35.–
KIIV
~ Moderátor
+43
God of flame
8. 4. 2017   #3
-
+1
-
Zajímavé

To zni jako klasicky problem s nacitanim znaku. Musis ho potvrdit pomoci enteru, coz znamena pod windowsama dva extra znaky: \r\n. A nacteni tehle extra znaku bude delat to co popisujes.

Kazdopadne zkus toto:

scanf(" %c", &pismeno);


Ta mezera pred %c znamena, ze se zahodi bile znaky (coz CR/LF jsou) a nacte se az nejaky citelny znak.

Nahlásit jako SPAM
IP: 94.113.99.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Rostislav
~ Anonymní uživatel
3 příspěvky
8. 4. 2017   #4
-
0
-

#3 KIIV
Díky moc! Funguje to   

Nahlásit jako SPAM
IP: 109.238.35.–
Staon0
Návštěvník
11. 4. 2017   #5
-
0
-

#3 KIIV
Moc pěkné, tenhle trik jsem neznal. Scanf jsem sice už asi 10 let nepoužil, ale stejně je to hezký tip.

Nahlásit jako SPAM
IP: 94.142.234.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 91 hostů

Podobná vlákna

Scanf - C — založil jakub

Scanf v C - segmentace — založil tap9701

C - scanf zacykleni — založil Remder

Vysvetleni funkce scanf — založil profeld

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý