2016-09-29 3 views
-1

申し訳ありません、これはばかげた質問ですが、私はC++を初めて使う人です。すべての入力を出力に正しくコピーしないのはなぜですか?Printfが間違った文字と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

なぜ、C++コードの第1位で 'scanf()'と 'printf()'を使用していますか? –

+0

私がcoutを使用すると、すべての小数点以下の桁は印刷されませんが、printfと同様に、それはHackerRankが私に求めていることです(https://www.hackerrank.com/challenges/c-tutorial-基本データ型?h_r = next-challenge&h_v = zen) – kirill2485

+3

'std :: fixed'と' std :: setprecision() '[manipulators](http://en.cppreference.com/w/cpp/)をチェックしてください。 io/manip)。 –

答えて

5

あなたが意図したものではありませんいくつかの変数のための&を持っているので。

printf("%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); 

あなたが渡す値は書式指定子に一致しないとしてあなたのコンパイラはこのことについて警告している必要がありますする必要があります。そうでない場合は、コンパイラの警告をオン/オンにします。

4

printfには、ポインタではなく値そのものを渡す必要があります。

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

Printf(ほとんどの場合)では、変数に&を使用しません。

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

また、C++を初めてお使いの方は、I/O操作を実行するためのより良い方法があります。 printf(...)を使用している間代わりに「printf関数」の代わりに「scanf関数」の「CIN」および「COUT」

#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

あなたのコードを使用すると、倍精度の出力は正しくありません。これは-5279235.721231465となっていますが、-5279235.721231として出力されます。 coutの代わりにprintfを使用すると、これが解決されます。 – kirill2485

+0

@ kirill2485:それは「間違っている」わけではありません。あなたが特定の精度を気にしているなら、_either_アプローチでそれを述べる必要があります。あなたは 'printf'があなたが望むものにデフォルトしてしまうのは幸運なことです。このためIOライブラリを切り替えることは、あなたのツールを構成する方法を研究する代わりに、馬鹿げたことです!あなたはそのような選択のより良い理由があるべきです。 –

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); 
    printf("%d %ld %lld %c %f %lf", num1, num2, num3, char1, num4, num5); 
    system("pause"); 
    return 0; 
} 
関連する問題