0

我目前刚刚开始学习 C(因为 PHP 和相关语言更多地是我的领域),所以我想我会从一个挑战开始。

我决定加入 CodeChef 并尝试他们的简单练习挑战之一,但显然我的代码在运行时出现 SIGSEGV 错误。

您能否检查我的代码以了解我收到此错误的原因,该代码在我尝试过的多个机器上运行良好(Mac OSX、Linux(CentOS 和 Ubuntu))。

这是代码:

#include <stdio.h>
#include <stdlib.h>

#ifndef BANK_CHARGE
  #define BANK_CHARGE  0.5
#endif;

int main (int argc, char **argv){
  // if(argc != 3){
  //   printf("Usage: %s [int] [float]\n", argv[0]);
  //   exit(1);
  // }

  int withdraw = atoi(argv[1]);
  float balance = atof(argv[2]);

  if((withdraw % 5) != 0){
    printf("%.2f", balance);
    exit(1);
  }
  if(withdraw > 2000 || withdraw == 0){
    printf("%.2f", balance);
    exit(1);
  }

  float totalWithdraw = (withdraw + BANK_CHARGE);

  if(totalWithdraw >= balance){
    printf("%.2f", balance);
    exit(1);
  }

  printf("%.2f", balance - totalWithdraw);
  return 0;
}

挑战位于此处: http: //www.codechef.com/problems/HS08TEST

但这里是问题摘要:

此问题的所有提交都是可用的。

Pooja 想从 ATM 取款 X 美元。取款机只接受X为5的倍数,且Pooja账户余额有足够现金进行取款交易(包括银行手续费)的交易。对于每次成功取款,银行收取 0.50 美元的费用。

尝试交易后计算 Pooja 的账户余额。输入

正整数 0 < X <= 2000 - Pooja 希望提取的现金数量。

非负数 0<= Y <= 2000,精度为两位数 - Pooja 的初始账户余额。输出

在尝试交易后输出账户余额,以两位精度的数字形式给出。如果账户里没有足够的钱来完成交易,输出当前的银行余额。示例 - 成功的交易

输入:30 120.00

输出:89.50

示例 - 提款金额不正确(不是 5 的倍数)

输入:42 120.00

输出:120.00

示例 - 资金不足

输入:300 120.00

输出:120.00

4

1 回答 1

1

SIGSEGV - 段错误。这意味着您的程序的一部分实际上正在尝试读取写入您的程序没有权限的内存地址。

像在没有命令参数的情况下运行程序这样简单的事情可能会导致此操作系统错误,因为无法保证您被允许读取的有效内存位置argv[1]argv[2]更有可能包含的随机数argv[1]argv[2]几乎可以肯定不是有效位置atoiatof可能从中读取。不确定为什么您注释掉了对有效参数数量的检查,因为这将保护您的程序免于犯此罪。

我假设您首先在基于 Unix 的操作系统(例如 Linux)上运行以获得 SIGSEGV。因此,我建议您在 GNU 调试器 ( gdb) 中运行您的程序,它还会向您显示导致此错误的代码行。使用调试器是一种很好的学习技术,可以让您在将问题带到更广泛的社区之前解决问题。(提示提示)。

于 2013-07-31T16:21:07.687 回答