2015-01-25 2 views
5

In scanf() Funktion möchte ich nur bis Dezimalwerte nehmen.Können wir es erreichen? Zum Beispiel für die Anzeige von bis zu zwei Dezimalstellen verwenden wir printf("%.2f",A) Wie können wir es für scanf() Funktion tun.Wie akzeptiert man nur eine bestimmte Genauigkeit (so viele Dezimalstellen) in scanf?

+0

Scanf verwendet fast das gleiche Format. –

+0

Warum möchten Sie das tun? –

+0

Ich habe es versucht. Beim Versuch, die angezeigte Variable als 0.00000 anzuzeigen –

Antwort

2

Sie das nicht tun, können Sie scanf() machen können eine bestimmte Anzahl von Zeichen lesen, wenn Sie wie

float value; 
scanf("%4f", &value); 

wollen und nehmen sie an dem Eingang

43.23 

ist es

lesen
43.2 

aber Sie können keine Genauigkeit angeben.

Es macht keinen Sinn machen, können, was Sie tun, ist

float value; 
if (scanf("%f", &value) == 1) 
    printf("%.2f\n", value); 

schließlich wird die Genauigkeit durch die binäre Darstellung beschränkt, es nur zwei Dezimalstellen so machen müssen, ist sinnlos, da darin arithmetische Operationen könnte abgerundet sein.

0

es ist nicht möglich, Präzision in scanf zu erwähnen. Sie können jedoch die Anzahl der Eingabezeichen wie scanf ("% 4f", & a) einschränken.

3

scanf() hat keine einfache Methode, um das Ziel von OP zu erreichen.
Empfehlen Sie für die Eingabe fgets() und dann die Zeichenfolge analysieren.

char buf[20]; 
fgets(buf, sizeof buf, stdin); // Could add check for NULL here 

Um auf 2 Dezimalstellen zu begrenzen, Code die Zahl in Teilen lesen kann: ganzzahligen Teil und Fraktion, dann das Ergebnis bilden:

long long ipart; 
unsigned d[2]; 
int n; 
if (sscanf(buf, "%lld.%1u%1u %n", &ipart, &d[0], &d[1], &n) != 3 || buf[n]) { 
    Handle_InvalidInput(); 
} 
double value = (d[0]*10 + d[1])/100.0; 
value = ipart + ipart < 0 ? -value : value; 

Auch wenn dieser Quest OPs erfüllt, ich glaube nicht, Es löst das größere Ziel von OP. Also anstatt Eingang zu begrenzen, lesen Sie die Eingabe und dann qualifizieren:

double value; 
if (sscanf(buf, "%lf %n", &value, &n) != 1 || buf[n]) { 
    Handle_InvalidInput(); 
} 
double rounded_value = round(value * 100.0)/100.0; 
if (rounded_value != value) { 
    Handle_OverlyPreciseNumber(value, rounded_value); 
} 

Andere pedantischer Methoden würden inspizieren die Zeichenfolge buf für ddd ... DDD.DD Syntax, etc. Aber das Problem ist klar: Lesen Sie die Daten und dann qualifizieren die Daten gelesen. Versuchen Sie nicht, die Eingabe einzuschränken.

0
  1. umfassen stdlib.h
  2. umfassen math.h
  3. IF Funktion pow von math.h zu kompilieren fehlschlägt, muss mit gcc file.c -o file -lm
  4. TRY Beispiel kompilieren:

Eingang: 13254,45488

Ausgabe: 13254.45

void main() 
{ 

    int x,y,i ; 
    int precision = 2 ; /*Insert precision here*/ 
    char a[precision] ; 
    long double z,result ; 

    printf("Input : "); 
    scanf("%d" , &x); 

    for (i = 0 ; i <= precision ; i++) 
    { 

     a[i] = getchar(); 

     if (a[i] == 10) break; 

    } 

    a[0] = '0'; 
    a[i] = '\0'; 

    y = atoi(a); 
    z = y/pow(10 , i-1); 
    result = x ; 

    if (z != 0) result = result + z ; 

    printf("Output: "); 
    printf("%.*Lf\n", i-1 , result); 

} 
+0

Code muss funktionieren. 1) 'char a [Genauigkeit]; ... für (i = 0; i <= Genauigkeit; i ++) { a [i] = getchar(); ... 'ist UB (Pufferüberlauf). 2) Fails für negative Zahlen. 3) Failed, wenn der gesamte Port außerhalb des "int" -Bereichs liegt. 4) 'if (z! = 0)' ist unnötig. 5) schlägt fehl, wenn der Bruchteileingabeteil kleiner ist als die "Präzisionsziffern". 6) kleinere Probleme mit der Annahme von Eingabe wie "123 456" als 123.45 anstelle von 123 und Verlassen von 456 für später. – chux

Verwandte Themen