如何修复C中scanf()的返回值?
我正在为一个编程类编写一些C代码,该类从如何修复C中scanf()的返回值?,c,C,我正在为一个编程类编写一些C代码,该类从stdin获取输入。该程序用于检查输入格式,如果输入格式不正确,则终止。我的问题是程序没有读取正确格式的输入 它需要执行的第一个检查是int。如果我错了,请纠正我,但是当您将%d作为参数时,scanf()应该跳过空白,直到它找到int。然后,它应该返回一个int:它接收到的成功输入数。我将此返回值赋值给一个变量,以便检查错误。我的scanf() 我的代码如下: double stddev(double sum, double sum_of_squares,
stdin
获取输入。该程序用于检查输入格式,如果输入格式不正确,则终止。我的问题是程序没有读取正确格式的输入
它需要执行的第一个检查是int
。如果我错了,请纠正我,但是当您将%d
作为参数时,scanf()
应该跳过空白,直到它找到int
。然后,它应该返回一个int
:它接收到的成功输入数。我将此返回值
赋值给一个变量,以便检查错误。我的scanf()
我的代码如下:
double stddev(double sum, double sum_of_squares, int n){
double variance, result;
variance = ((n * sum_of_squares) - pow(sum, 2)) / (n * (n - 1));
result = sqrt(variance);
return result;
}
int nextinput() {
int true = 1;
int false = 0;
int current = getchar();
if (isspace(current)) {
while (isspace(current = getchar())) {
if (current == '\n') {
return false;
}
}
}
else {
return false;
}
ungetc(current, stdin);
return true;
}
int main() {
char current_char;
int ret, current_int, control;
int max_char = 0;
int int_sum = 0;
int max_int = INT_MIN;
int min_int = INT_MAX;
int count = 0;
double current_double, double_avg, standard_dev;
double double_sum = 0;
double double_squared_sum = 0;
while ((control = getchar()) != EOF) {
ungetc(control, stdin);
ret = scanf("%d", ¤t_int);
printf("%d", ret);
if (ret == 1) {
ret = nextinput();
if (ret == 1) {
ret = scanf("%c", ¤t_char);
if (ret == 1) {
ret = nextinput();
if (ret == 1) {
ret = scanf("%lf", ¤t_double);
if (ret == 1) {
int_sum += current_int;
double_sum += current_double;
double_squared_sum += pow(current_double, 2);
count++;
if (current_int > max_int) {
max_int = current_int;
}
if (current_int < min_int) {
min_int = current_int;
}
if (current_char > max_char) {
max_char = current_char;
}
}
else {
fprintf(stderr, "Invalid input. A double was "
"missing\n");
return EXIT_FAILURE;
}
}
else {
fprintf(stderr, "Invalid input. There was a space "
"missing or a new line found after a "
"character.");
return EXIT_FAILURE;
}
}
else {
fprintf(stderr, "Invalid input. A character was missing."
"\n");
return EXIT_FAILURE;
}
}
else {
fprintf(stderr, "Invalid input. There was a space missing or "
"a new line found after an integer.\n");
}
}
else {
fprintf(stderr, "Invalid input. An integer was missing.\n");
return EXIT_FAILURE;
}
}
standard_dev = stddev(double_sum, double_squared_sum, count);
double_avg = double_sum / count;
printf("Sum of integers: %d\n", int_sum);
printf("Max integer seen: %d\n", max_int);
printf("Min integer seen: %d\n", min_int);
printf("Max char value seen: %d\n", max_char);
printf("Average of doubles: %.3lf\n", double_avg);
printf("Standard deviation of doubles: %.3lf\n", standard_dev);
return EXIT_SUCCESS;
}
double stddev(双和,双平方和,int n){
双方差,结果;
方差=((n*平方和)-pow(和,2))/(n*(n-1));
结果=sqrt(方差);
返回结果;
}
int nextinput(){
int真=1;
int假=0;
int current=getchar();
if(isspace(当前)){
while(isspace(current=getchar())){
如果(当前=='\n'){
返回false;
}
}
}
否则{
返回false;
}
ungetc(电流、标准输入);
返回true;
}
int main(){
字符当前字符;
int ret,当前_int,控制;
int max_char=0;
int_sum=0;
int max_int=int_MIN;
int min_int=int_MAX;
整数计数=0;
双电流,双平均值,标准偏差;
双倍和=0;
双平方和=0;
而((control=getchar())!=EOF){
ungetc(控制,标准输入);
ret=scanf(“%d”和当前值);
printf(“%d”,ret);
如果(ret==1){
ret=nextinput();
如果(ret==1){
ret=scanf(“%c”和当前字符);
如果(ret==1){
ret=nextinput();
如果(ret==1){
ret=scanf(“%lf”和当前双精度);
如果(ret==1){
int_sum+=当前int;
double_sum+=当前_double;
double_squared_sum+=pow(当前_double,2);
计数++;
如果(当前值>最大值){
最大值=当前值;
}
如果(当前整数<最小整数){
最小值=当前值;
}
如果(当前字符>最大字符){
最大字符=当前字符;
}
}
否则{
fprintf(stderr,“无效输入。双精度为”
“失踪”;“失踪”;
返回退出失败;
}
}
否则{
fprintf(stderr,“无效输入。存在空格”
“a后缺少或找到新行”
"品格";;
返回退出失败;
}
}
否则{
fprintf(stderr,“输入无效。缺少字符。”
“\n”);
返回退出失败;
}
}
否则{
fprintf(stderr,“无效输入。缺少空格或”
“在整数后找到新行。\n”);
}
}
否则{
fprintf(stderr,“无效输入。缺少整数。\n”);
返回退出失败;
}
}
标准偏差=标准偏差(双和、双平方和、计数);
平均双倍=双倍总和/计数;
printf(“整数和:%d\n”,整数和);
printf(“看到的最大整数:%d\n”,最大整数);
printf(“看到的最小整数:%d\n”,最小整数);
printf(“看到的最大字符值:%d\n”,最大字符);
printf(“双倍平均值:%.3lf\n”,双倍平均值);
printf(“双精度标准偏差:%.3lf\n”,标准偏差);
返回退出成功;
}
该程序不应该提示用户输入,我们只需要重定向来自文件的输入。我的测试文件包含以下内容:
开始文件
一,
结束文件
我使用printf()检查变量,并将ret
设置为1,但如果执行语句,则中的所有代码都不会被执行。然后,ret
被设置为-1,代码给了我错误消息。看起来是这样的:
开始输出
输入无效。缺少一个整数。
1-1
结束输出
有人能帮我理解为什么会这样吗?我的程序还有很多内容,但在我的程序终止之前似乎没有执行。关于此函数:
int nextinput()
{
int true = 1;
int false = 0;
int current = getchar();
if (isspace(current))
{
while (isspace(current = getchar()))
{
if (current == '\n')
{
return false;
}
else
{}
}
}
else
{
return false;
}
ungetc(current, stdin);
return true;
}
nextinput()函数更好的定义是:
#include <stdbool.h>
int nextInput() // for readability, use 'camel case' for function and variable names
{
int current;
while (isspace(current = getchar()))
{
if (current == '\n')
{
return false;
}
}
ungetc(current, stdin);
return true;
}
#包括
int nextInput()//为了可读性,函数名和变量名使用“camel case”
{
电流;
while(isspace(current=getchar()))
{
如果(当前=='\n')
{
返回false;
}
}
ungetc(电流、标准输入);
返回true;
}
但是,main()函数包含几个问题,我甚至没有查看stddev()函数
强烈建议浏览代码,看看输入文件(不正确/意外的内容)的实际情况。