C++ 为什么可以';I scanf和printf是整数吗? #包括 #包括 #包括 #包括 使用名称空间std; 结构人 { 智力年龄; 字符串名称[20],dob[20],pob[20],性别[7]; }; int main() { 个人[10]; cout

C++ 为什么可以';I scanf和printf是整数吗? #包括 #包括 #包括 #包括 使用名称空间std; 结构人 { 智力年龄; 字符串名称[20],dob[20],pob[20],性别[7]; }; int main() { 个人[10]; cout,c++,c,printf,user-input,scanf,C++,C,Printf,User Input,Scanf,您应该将age的类型从float更改为int 否则,请将%f用于浮动类型 另外,根据的建议,将字符串更改为字符 然后,从&person[0]中删除和。年龄如果是printf()。要打印变量的值,而不是地址。FWIW,要打印地址,应使用%p格式说明符并将参数强制转换为(void*) 不要混淆它们并期望它们工作。如果您向提供的格式说明符提供不正确类型的参数,最终将导致错误 故事的寓意是:启用编译器警告。大多数情况下,它们会警告您潜在的陷阱。您正在将值的地址传递给printf。对于传递给printf的

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

否则,请将
%f
用于
浮动
类型

另外,根据的建议,将
字符串
更改为
字符

然后,从
&person[0]中删除
。年龄
如果是
printf()
。要打印变量的值,而不是地址。FWIW,要打印地址,应使用
%p
格式说明符并将参数强制转换为
(void*)

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


故事的寓意是:启用编译器警告。大多数情况下,它们会警告您潜在的陷阱。

您正在将值的地址传递给
printf
。对于传递给
printf
的所有参数和传递给
scanf
的字符串,请清除
&
。正如其他人所说的那样e
%f
对于浮动或将
age
更改为
int
首先,将
person
声明中的
字符串
更改为
字符

#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;
}
然后,您需要在调用
printf
时从
&person[0]中删除符号and。age
,因为您传递的是
int
的地址,而不是它的值。此外,还需要从
scanf
printf
调用中的字符串中删除符号and:

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

您在这里有一个错误:

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);
应该是:

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

因为,当您在printf函数中使用“&”时,您打印的是变量的地址,而不是他的值。所以请记住,您只需使用“&”来扫描任何内容,而不是打印。

奇数年龄的原因是您输出的是人[0]的地址。年龄,而不是值。printf()取值,scanf()获取地址。您可能还指的是char*数组,而不是字符串对象。下面的代码可编译(尽管有一些合理的警告),并打印正确的输出(已测试):

#包括
#包括
#包括
#包括
使用名称空间std;
结构人
{
智力年龄;
字符名称[20],dob[20],pob[20],性别[7];
};
int main()
{
个人[10];

CUT使用代码> %F.<代码>为浮动。或定义年龄 int;使用<代码> CIN < /C>和 CUT(您刚开始时已经做过一次),如果使用C++中不能使用的C++特性(<代码> IoSturi,<代码> CUT,<代码>使用命名空间< /代码>等),不要用C标记问题。我本想写int。但它仍然不起作用。你不能使用scanf读取
std::string
s。@johnny880:在你的
printf
调用中,你正在写指针的值,这不是你想要的。你好,谢谢你,但我从一开始就这么做了。我不是有意让它浮在那里的。它本应该是int。我编辑了问题,但仍然不起作用。这也不起作用。对于年龄,当我键入20时,它打印出0。现在它修复了“2749536”,但当我输入一个“20”时,它打印出0。@johnny880您输入的值是什么?它们是否包含空格?我输入时完全没有引号:“John 1/15/1994 Maine Male 20”不管怎样,它现在可以工作了。我只是忘了在程序本身中将浮点值更改为int。但是现在程序崩溃了。@johnny880这是因为您对
结构中的字符串使用了
string
而不是
char
。修复此问题会使程序运行(请参阅演示)。
printf("%s %s %s %s %d", person[0].name, person[0].dob, person[0].pob, person[0].gender, person[0].age);
#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;
}