2016-09-29 92 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; 
}