我只是在学校做些小运动,而我却受困于scanf函数。
如果我正在运行此代码,则一切在开始时都可以正常工作,但是一旦完成所有5个scanf,它就会停止工作并退出,而无需最后打印该printf。问题出在哪里?
现在有了代码(我在Windows 10上的Visual Studio 2017中编写代码):
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main() {
char name[50];
char gender[1];
float wage = 0;
int age = 0;
int height = 0;
printf("\nInput Name: ");
scanf(" %s", name);
printf("\nInput Gender (m/f): ");
scanf(" %c", &gender);
printf("\nInput Monthly Wage: ");
scanf(" %d", &wage);
printf("\nInput Age: ");
scanf(" %d", &age);
printf("\nInput height in cm: ");
scanf(" %d", &height);
printf("\nNAME: %s\nGENDER: %c\nWAGE %d\AGE: %d\nSIZE: %d", name, gender, wage, age, height);
return 0;
getchar();
}
答案 0 :(得分:1)
您的代码有很多问题,让我们一一讨论:
问题1 :
scanf(" %c", &gender);
在这里使用&gender
就是问题所在。您已将性别声明为字符数组而不是变量,因此在scanf
语句中,您必须传递数组的第一个元素的地址,因此可以使用&gender
代替gender
或&gender[0]
。
如果您尚未了解指针和地址,请转到此链接:
https://www.youtube.com/playlist?list=PL2_aWCzGMAwLZp6LMUKI3cc7pgGsasm2_
此外,您只需要输入一个字符,则不需要数组。只需使用char gender;
而不是char gender[];
问题2 :
scanf(" %d", &wage);
您已将工资宣布为浮动工资,因此请使用%f
而不是%d
。
问题3 :
printf("\nNAME: %s\nGENDER: %c\nWAGE %d\AGE: %d\nSIZE: %d", name, gender, wage, age, height);
在这里查看%d\AGE
\A
将发出警告,因为它似乎是编译器的未知转义序列。实际上,这是您错过\ n的错字。
所以最后用下面的代码行替换您的问题:
char gender;
scanf("%f", &wage);
printf("\nNAME: %s\nGENDER: %c\nWAGE %f\nAGE: %d\nSIZE: %d", name, gender, wage, age, height);
答案 1 :(得分:0)
您的代码存在一些问题。
虽然已指出性别,但简单的解决方法是将其声明为变量。
char gender;
... // Do stuff
scanf("%c", &gender);
工资是浮动的,除非您想将其声明为整数,否则请尝试
float wage;
... // Do stuff
scanf("%f", &wage);
最后,printf缺少正确的换行符,但这可能不是问题。
代替
printf("\nNAME: %s\nGENDER: %c\nWAGE %d\AGE: %d\nSIZE: %d", name, gender, wage, age, height);
尝试
printf("\nNAME: %s\nGENDER: %c\nWAGE %f\nAGE: %d\nSIZE: %d", name, gender, wage, age, height);
此外,getchar()
无效,因为它发生在返回之后。 return语句后的任何内容均无效。
我很可能会漏掉其他错误,但是进行建议的更改应该足够了。
答案 2 :(得分:0)
有些问题会导致未定义的行为或“意外的”情况,因此您应该为此得到编译器警告(如果没有,请打开它们)。
首先,如果您以后要写gender
,则char gender;
应该定义为scanf(" %c", &gender);
。
第二,wage
的类型为float
,因此scanf
和printf
需要格式说明符%f
(而不是%d
)。 / p>
第三,您的代码“无法访问”,因为您的getchar
在return 0
语句之后。
第四,不是错误/警告,只是要注意,printf
在将其缓冲区刷新到控制台之前可能要等待新行。所以写
char gender;
...
scanf(" %f", &wage);
...
printf("\nNAME: %s\nGENDER: %c\nWAGE %f\AGE: %d\nSIZE: %d\n", name, gender, wage, age, height);
...
getchar();
return 0;