为什么我不能扫描并打印整数?

时间:2015-11-10 20:23:20

标签: c++ c printf user-input scanf

#include <stdio.h>
#include <iostream>
#include <cstdlib>
#include <sstream>

using namespace std;

struct person
{
    int age;
    string name[20], dob[20], pob[20], gender[7];
};

int main ()
{
    person person[10];
    cout << "Please enter your name, date of birth, place of birth, gender, and age, separated by a space.\nFor example, John 1/15/1994 Maine Male 20: ";
    scanf("%s %s %s %s %d", &person[0].name, &person[0].dob, &person[0].pob, &person[0].gender, &person[0].age);
    printf("%s %s %s %s %d", &person[0].name, &person[0].dob, &person[0].pob, &person[0].gender, &person[0].age);
    return 0;
}

我尝试扫描并打印用户的年龄,但它为person.age值提供了2749536。那是为什么?

5 个答案:

答案 0 :(得分:5)

首先,在string声明中将char更改为person

struct person
{
    int age;
    char name[20], dob[20], pob[20], gender[7];
//  ^^^^
};

然后,您需要在调用&person[0].age时从printf中删除&符号,因为您传递的是int的地址,而不是其值。同时从scanfprintf来电中删除字符串中的&符号:

scanf("%s %s %s %s %d", person[0].name, person[0].dob, person[0].pob, person[0].gender, &person[0].age);
// Only one ampersand is needed above: -------------------------------------------------^
printf("%s %s %s %s %d", person[0].name, person[0].dob, person[0].pob, person[0].gender, person[0].age);

Google Cloud Storage connector

答案 1 :(得分:3)

您应该将age的类型从float更改为int

否则,请将%f用于float类型。

另外,根据Mr. dasblinkenlight的建议,将string更改为char

然后,如果&,请从&person[0].age移除printf()。您想要打印变量的值,而不是地址。 FWIW,要打印地址,您应该使用%p格式说明符并将参数转换为(void *)

不要混淆它们并期望它们起作用。如果向提供的格式说明符提供不正确类型的参数,最终将导致undefined behavior

故事的道德:启用编译器警告。大多数时候,他们会警告你潜在的陷阱。

答案 2 :(得分:1)

您正在将值的地址传递给printf。删除传递给&的所有参数的printf以及传递给scanf的字符串。另外,正如其他人所说的那样,使用%f表示浮点数或将age更改为int

答案 3 :(得分:1)

你在这里有错误:

printf("%s %s %s %s %d", &person[0].name, &person[0].dob, &person[0].pob, &person[0].gender, &person[0].age);

应该是:

printf("%s %s %s %s %d", person[0].name, person[0].dob, person[0].pob, person[0].gender, person[0].age);

因为,当你使用&#39;&amp;&#39;在printf函数中,您打印变量的地址而不是他的值。所以请记住,你只需要使用&#39;&amp;&#39;扫描任何东西,而不是打印。

答案 4 :(得分:1)

奇数年龄的原因是你输出的人[0] .age的地址,而不是值。 printf()获取值,scanf()获取地址。你也可能意味着char *数组而不是字符串对象。下面的代码编译(虽然有一些合理的警告),并打印正确的输出(测试):

#include <stdio.h>
#include <iostream>
#include <cstdlib>
#include <sstream>

using namespace std;

struct person
{
    int age;
    char name[20], dob[20], pob[20], gender[7];
};

int main ()
{
    person person[10];
    cout << "Please enter your name, date of birth, place of birth, gender, and age, separated by a space.\nFor example, John 1/15/1994 Maine Male 20: ";
    scanf("%s %s %s %s %d", &person[0].name, &person[0].dob, &person[0].pob, &person[0].gender, &person[0].age);
    printf("%s %s %s %s %d", &person[0].name, &person[0].dob, &person[0].pob, &person[0].gender, person[0].age);
    return 0;
}