2016-09-29 3 views
-1

Sorry, wenn dies eine dumme Frage ist, bin ich neu in C++. Warum werden nicht alle Eingaben korrekt in die Ausgabe kopiert?Printf Drucken falsch char und 0

#include <iostream> 
#include <iomanip> 
#include <limits> 
#include <string> 

using namespace std; 

int main() { 
    int num1; 
    long num2; 
    long long num3; 
    char char1; 
    float num4; 
    double num5; 
    scanf("%d %ld %lld %c %f %lf", &num1, &num2, &num3, &char1, &num4, &num5); 
    //input: 211916801 452082285 97592151379235457 p 19856.992 -5279235.721231465 
    printf("%d %ld %lld %c %f %lf", num1, num2, &num3, &char1, &num4, &num5); 
    //expected output: 211916801 452082285 97592151379235457 p 19856.992 -5279235.721231465 
    //actual output: 211916801 452082285 68674564278975280 c 0.000000 0.000000 
    system("pause"); 
    return 0; 
} 
+4

Warum verwenden Sie 'scanf()' und 'printf()' in C++ Code an erster Stelle? –

+0

weil, wenn ich cout verwende, es nicht das Doppelte mit allen Dezimalzahlen druckt, aber mit printf tut es auch, das ist, was HackerRank mich auffordert (https://www.hackerrank.com/challenges/c-tutorial-) basic-data-types? h_r = next-challenge & h_v = zen) – kirill2485

+3

Überprüfen Sie die 'std :: fixed' und' std :: setprecision() '[manipulators] (http://en.cppreference.com/w/cpp/ io/manip). –

Antwort

5

Weil Sie & für einige der Variablen, die nicht das, was Sie bestimmt.

printf("%d %ld %lld %c %f %lf", num1, num2, &num3, &char1, &num4, &num5); 

sollte

sein
printf("%d %ld %lld %c %f %lf", num1, num2, num3, char1, num4, num5); 

Ihr Compiler darüber, wie die Werte gewarnt haben, sollten Sie die Formatbezeich nicht übereinstimmen übergeben. Wenn nicht, aktivieren/erhöhen Sie die Compiler-Warnungen.

4

Sie sollten die Werte selbst, nicht Zeiger, an printf übergeben.

printf("%d %ld %lld %c %f %lf", num1, num2, num3, char1, num4, num5); 
3

In Printf (in den meisten Fällen) Sie verwenden nicht & in Ihren Variablen.

Plus, wenn Sie neu in C++ sind, gibt es eine bessere Möglichkeit zum Ausführen von E/A-Operationen. Verwenden Sie „cin“ anstelle von „scanf“ und „cout“ anstelle von „printf“

#include <iostream> 
#include <iomanip> 
#include <limits> 
#include <string> 

using namespace std; 

int main() { 
    int num1; 
    long num2; 
    long long num3; 
    char char1; 
    float num4; 
    double num5; 

    //scanf("%d %ld %lld %c %f %lf", &num1, &num2, &num3, &char1, &num4, &num5); 
    cin >> num1; 
    cin >> num2; 
    cin >> num3; 
    cin >> char1; 
    cin >> num4; 
    cin >> num5; 
    //input: 211916801 452082285 97592151379235457 p 19856.992 -5279235.721231465 

    //printf("%d %ld %lld %c %f %lf", num1, num2, &num3, &char1, &num4, &num5); 
    cout << num1; 
    cout << num2; 
    cout << num3; 
    cout << char1; 
    cout << num4; 
    cout << num5; 

    //expected output: 211916801 452082285 97592151379235457 p 19856.992 -5279235.721231465 
    //actual output: 211916801 452082285 68674564278975280 c 0.000000 0.000000 

    system("pause"); 
    return 0; 
} 
+0

Mit Ihrem Code ist die Ausgabe für das Double falsch, es soll -5279235.721231465 sein, aber es wird als -5279235.721231 ausgedruckt. Die Verwendung von printf anstelle von cout löst dies. – kirill2485

+0

@ kirill2485: Das ist nicht "falsch". Wenn Ihnen eine bestimmte Genauigkeit wichtig ist, müssen Sie dies mit _either_ approach angeben. Sie haben nur Glück, dass 'printf' zufällig auf das kommt, was Sie wollen. Das Umschalten von E/A-Bibliotheken aus diesem Grund (anstatt zu untersuchen, wie Sie Ihr Tool konfigurieren) ist lächerlich! Sie sollten bessere Gründe für solche Entscheidungen haben. –

0

Während printf(...) verwenden, werden primitive Typen von Wert nicht als Referenz übergeben. Verwenden Sie den folgenden Code:

#include <iostream> 
#include <iomanip> 
#include <limits> 
#include <string> 

using namespace std; 

int main() { 
    int num1; 
    long num2; 
    long long num3; 
    char char1; 
    float num4; 
    double num5; 
    scanf("%d %ld %lld %c %f %lf", &num1, &num2, &num3, &char1, &num4, &num5); 
    printf("%d %ld %lld %c %f %lf", num1, num2, num3, char1, num4, num5); 
    system("pause"); 
    return 0; 
}