PROBLEMA Problema con C!

fabio93

Utente Attivo
609
173
CPU
AMD Ryzen 5 2400G
Dissipatore
Arctic Alpine64 Plus
Scheda Madre
Gigabyte GA-AX370-Gaming 3
HDD
Crucial MX500 250 GB, Crucial BX500 240 GB
RAM
G.Skill F4-3200C14D-16GFX FlareX 16 GB
Monitor
HP 2010i
PSU
Corsair TX550M
Case
Sharkoon M25-W
Periferiche
Magicforce 68, Logitech G203
OS
Windows 10 Pro, Fedora 31
A meno che io non abbia le traveggole il frammento di codice da te postato mi sembra ok, per questo volevo vedere tutto il codice. Comunque l'errore è che compare la scritta "press any key.."?
 

HardGriffin

Nuovo Utente
26
0
Mmmm, in un certo senso sì.
Ecco dovrei fare un giochino molto stupido dove alla fine ti viene detto quanto sei intelligente da 1 a 10.
Il codice è questo, ma non creda serva granchè...

#include<stdio.h>

main()
{
//Intro

printf("TEST DELL'INTELLIGENZA\n\n");
printf("Ti sei mai chiesto quanto tu sia realmente intelligente?\n");
printf("Verifichiamolo subito!\n\n");

system("pause");
printf("\n\n");

printf("Ti daro' 10 domande a cui dovrai rispondere\n\n\n");

system("pause");
printf("\n\n");

//Prima Domanda

//2-->10
//4-->20
//6-->30
//10-->?(50=50x10)

int a;

printf("Completa la sequenza\n\n");

printf("2-->10\n");
printf("4-->20\n");
printf("6-->30\n");
printf("10-->?\n\n");

printf("10--> ");
scanf("%d",&a);

system("pause");
printf("\n\n");

//Seconda Domanda

int b;

printf("Completa la sequenza\n\n");

printf("C,F,I,N,Q,...\n");

printf(" ");
scanf("%d",&b);

system("pause");
printf("\n\n");

//Terza Domanda

printf("Completa la sequenza\n\n");

printf("30 28 26 ?\n");
printf("| | | |\n");
printf("| | | |\n");
printf("| | | |\n");
printf("25 23 21 ??\n");

int c1;

printf("?= ");
scanf("%d",&c1);

}
 

fabio93

Utente Attivo
609
173
CPU
AMD Ryzen 5 2400G
Dissipatore
Arctic Alpine64 Plus
Scheda Madre
Gigabyte GA-AX370-Gaming 3
HDD
Crucial MX500 250 GB, Crucial BX500 240 GB
RAM
G.Skill F4-3200C14D-16GFX FlareX 16 GB
Monitor
HP 2010i
PSU
Corsair TX550M
Case
Sharkoon M25-W
Periferiche
Magicforce 68, Logitech G203
OS
Windows 10 Pro, Fedora 31
Ho capito qual è il problema: non ti fa digitare il numero perché quando si arriva alla scanf, prima che tu possa premere un tasto, questa riceve in input l'ultimo carattere digitato prima, e ancora presente nel buffer di input (stdin). Per risolvere ci sono (almeno) due modi: il più immediato è far precedere la scanf da una getchar(), in modo che questa intercetti l'ultimo carattere ancora presente nel buffer non interferendo con il seguito del programma (potresti usare anche una scanf con una variabile creata ad hoc, ma è meno pratico). Il secondo metodo, che è anche il migliore, e che ti consiglio, è di eliminare tutte quelle system("pause"), anche perché si tratta di un'istruzione che non andrebbe mai usata: funziona solo su windows (non è portabile) ed è dispendiosa perché esegue una chiamata al sistema operativo, il che costa in termini di tempo, perciò è deprecata.
 

fabio93

Utente Attivo
609
173
CPU
AMD Ryzen 5 2400G
Dissipatore
Arctic Alpine64 Plus
Scheda Madre
Gigabyte GA-AX370-Gaming 3
HDD
Crucial MX500 250 GB, Crucial BX500 240 GB
RAM
G.Skill F4-3200C14D-16GFX FlareX 16 GB
Monitor
HP 2010i
PSU
Corsair TX550M
Case
Sharkoon M25-W
Periferiche
Magicforce 68, Logitech G203
OS
Windows 10 Pro, Fedora 31
Ad esempio con getchar() al posto di system("pause").
 
  • Mi piace
Reazioni: HardGriffin

DDog29

Nuovo Utente
24
7
Ho capito qual è il problema: non ti fa digitare il numero perché quando si arriva alla scanf, prima che tu possa premere un tasto, questa riceve in input l'ultimo carattere digitato prima, e ancora presente nel buffer di input (stdin). Per risolvere ci sono (almeno) due modi: il più immediato è far precedere la scanf da una getchar(), in modo che questa intercetti l'ultimo carattere ancora presente nel buffer non interferendo con il seguito del programma (potresti usare anche una scanf con una variabile creata ad hoc, ma è meno pratico). Il secondo metodo, che è anche il migliore, e che ti consiglio, è di eliminare tutte quelle system("pause"), anche perché si tratta di un'istruzione che non andrebbe mai usata: funziona solo su windows (non è portabile) ed è dispendiosa perché esegue una chiamata al sistema operativo, il che costa in termini di tempo, perciò è deprecata.

Suppongo che potrsti usare anche fflush(stdin); sono un po' arrugginito con il C ma in teoria dovrebbe "pulire" il buffer, va messo prima della scanf e non dovresti avere problemi.
 

Hobet

Utente Attivo
609
222
CPU
i5 6600k
Dissipatore
AIO H100
Scheda Madre
ASUS z170 Deluxe
HDD
1 WD Blue 1 TB; evo 850 500gb
RAM
Vengeance 4x4
GPU
GTX 1070ti MSI
Audio
Nope
Monitor
MG278Q
Case
750D Corsair
Net
Fastweb 200/30
OS
PucyBuntu
Suppongo che potrsti usare anche fflush(stdin); sono un po' arrugginito con il C ma in teoria dovrebbe "pulire" il buffer, va messo prima della scanf e non dovresti avere problemi.
NO.
fflush pulisce lo stdout non stdin.
 

Hobet

Utente Attivo
609
222
CPU
i5 6600k
Dissipatore
AIO H100
Scheda Madre
ASUS z170 Deluxe
HDD
1 WD Blue 1 TB; evo 850 500gb
RAM
Vengeance 4x4
GPU
GTX 1070ti MSI
Audio
Nope
Monitor
MG278Q
Case
750D Corsair
Net
Fastweb 200/30
OS
PucyBuntu
  • Mi piace
Reazioni: fabio93 e DDog29

fabio93

Utente Attivo
609
173
CPU
AMD Ryzen 5 2400G
Dissipatore
Arctic Alpine64 Plus
Scheda Madre
Gigabyte GA-AX370-Gaming 3
HDD
Crucial MX500 250 GB, Crucial BX500 240 GB
RAM
G.Skill F4-3200C14D-16GFX FlareX 16 GB
Monitor
HP 2010i
PSU
Corsair TX550M
Case
Sharkoon M25-W
Periferiche
Magicforce 68, Logitech G203
OS
Windows 10 Pro, Fedora 31
fflush(stdin) non è C standard, funziona su alcune implementazioni, su altre invece no (ha un "undefined behaviour"), pertanto è meglio evitarlo. Maggiori informazioni qui: https://stackoverflow.com/a/18170435
 
  • Mi piace
Reazioni: Hobet

DDog29

Nuovo Utente
24
7
okok buono a sapersi, vuol dire che ho pessimi ricordi di quello che ho studiato :thanks:
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili