2016-09-29 90 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++代碼中使用'scanf()'和'printf()'? –

+0

,因爲如果我使用cout它不會打印所有小數的double,但是使用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(...)使用「CIN」而不是「scanf函數」和「COUT」,而不是「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

使用你的代碼輸出不正確的雙數據,它應該是-5279235.721231465,但它打印出-5279235.721231。使用printf而不是cout解決了這個問題。 – 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; 
}