gpt4 book ai didi

c - 如何修复 C 中 scanf() 的返回值?

转载 作者:太空宇宙 更新时间:2023-11-04 04:34:19 25 4
gpt4 key购买 nike

我正在为从 stdin 获取输入的编程类编写一些 C 代码。该程序旨在检查输入格式并在输入格式不正确时终止。我的问题是程序没有读取格式正确的输入。

它需要执行的第一个检查是针对 int。如果我错了,请纠正我,但是当您将 %d 作为一个论点。然后它应该返回一个 int:它收到的成功输入的数量。我将此 return 值分配给一个变量,以便我可以检查错误。我的 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", &current_int);
printf("%d", ret);

if (ret == 1) {
ret = nextinput();
if (ret == 1) {
ret = scanf("%c", &current_char);
if (ret == 1) {
ret = nextinput();
if (ret == 1) {
ret = scanf("%lf", &current_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;
}

程序不应该提示用户输入,我们应该简单地将输入重定向到一个文件。我的测试文件包含以下内容:

开始文件

1

结束文件

我使用 printf() 检查了我的变量,并且 ret 被设置为 1,但是我的 if 语句中的所有代码都没有被执行。然后,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;
}

但是,main() 函数包含几个问题,我什至没有看 stddev() 函数。

强烈建议遍历代码以查看您的(不正确/意外内容)输入文件实际发生了什么。

建议阅读 getchar() 和 scanf() 以及 ungetc() 的手册页,以便更好地理解它们的作用以及返回的值。

建议在比较时始终将文字值放在左侧,这样编译器会捕获在需要 == 时输入 = 之类的错误

关于c - 如何修复 C 中 scanf() 的返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32767214/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com