#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。那是为什么?
答案 0 :(得分:5)
首先,在string
声明中将char
更改为person
:
struct person
{
int age;
char name[20], dob[20], pob[20], gender[7];
// ^^^^
};
然后,您需要在调用&person[0].age
时从printf
中删除&符号,因为您传递的是int
的地址,而不是其值。同时从scanf
和printf
来电中删除字符串中的&符号:
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);
答案 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;
}