【问题标题】:C function return errorC函数返回错误
【发布时间】:2016-04-08 01:52:03
【问题描述】:

我正在编写一个函数,该函数将用户输入最大为 1000,然后将输入的每个数字相加。因此,如果用户输入 12,则函数输出 3。

当用户输入 1000 或以上时,该函数将打印“那个数字太高”。我可以得到打印语句的函数,但它也输出14...我不明白为什么?

我知道我的代码中可能还有其他错误,但现在这就是要我死的错误。任何可以提供帮助的东西都会很棒。

这是我的代码。

#include <stdio.h>

int SummItAll(int value);

int main ()
{
  int userNumber=0, result;

printf("Enter a positive number \n ");
scanf("%d", &userNumber);

result = SummItAll(userNumber);
printf("%d\n", result);

return 0;
}

int SummItAll(int value)
{
int a=value, b, c, d, f, g;
if(a < 100)
{
  b = a/10;
  c = a%10;
  return b+c;
}
else if(a >= 100 && a < 1000)
{
  b = a/100;
  c = a%100;
  d = c/10;
  f = c%10;
  return b+d+f;
}
else
 return printf("That number is to high!\n");
}

【问题讨论】:

  • 我怀疑这不是实际代码。 printf()s 返回值是它输出的字符数(除非发生错误),并且您正在打印main() 中的函数返回值。我猜你的 ACTUAL 代码正在打印一个长度为 14 的不同字符串。
  • 你是对的,我在发布之前更改了最后的打印声明。它曾经是“Thats to high”,长度为 14 个字符。我希望 puts 可以代替 printf() 并且返回 10...感谢您的快速响应。

标签: c function if-statement


【解决方案1】:

printf 返回打印的字符数,因此它告诉您您的消息长度为 14 个字符。

与其返回printf 的结果,不如返回一个无效值(例如-1)来指示错误:

由于3个正数之和不可能是负数,所以可以检查SumItAll的结果,然后在出错的情况下采取不同的措施:

#include <stdio.h>

int SummItAll(int value);

int main ()
{
    int userNumber=0, result;

    printf("Enter a positive number \n ");
    scanf("%d", &userNumber);

    result = SummItAll(userNumber);

    if (result == -1)
    {
        printf("Please enter a POSITIVE number!\n");
    }
    else if (result == -2)
    {
        printf("That number is to high!\n");
    }
    else
    {
        printf("%d\n", result);
    }

    return 0;
}

int SummItAll(int value)
{
    int a=value, b, c, d, f, g;
    if (a < 0)
    {
        return -1; // too low!
    }
    else if(a < 100)
    {
        b = a/10;
        c = a%10;
        return b+c;
    }
    else if(a >= 100 && a < 1000)
    {
        b = a/100;
        c = a%100;
        d = c/10;
        f = c%10;
        return b+d+f;
    }
    else
    {
        return -2; // too high!
    }
}

请注意,-1-2 在上面的代码中将被视为“幻数”,因为它们具有不立即显而易见的特殊含义。最好在代码中定义一些符号来代替整数文字-1-2,以使含义更清楚。例如:

#define ERR_NUM_IS_NEGATIVE  -1
#define ERR_NUM_IS_TOO_LARGE -2

然后您可以在代码中使用这些符号名称而不是文字,这样应该会更清楚。

【讨论】:

  • 感谢您的快速回复!这非常有帮助。我希望只用 puts 语句替换 printf() ,但当然这很容易。 puts 语句返回 10 vs 14。看来我必须添加一些检查语句。感谢您的意见!
【解决方案2】:

对于您的用例,SummItAll 最好接受一个指针参数,其中输入和输出都被传递并返回一个布尔值以指示返回的结果是否有效。

bool SummItAll(int *value)
{
    if(...) {
      *value = ...
      return true;
    } else if(...) {
      ..
    } else {
       return false;
    }

}

【讨论】:

    【解决方案3】:

    printf() 函数返回一个整数,表示它已写出多少个字符。

    【讨论】:

    • 感谢您的快速回复。
    猜你喜欢
    • 2015-12-28
    • 2023-03-08
    • 2014-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-07
    • 2016-04-13
    • 1970-01-01
    相关资源
    最近更新 更多