c语言 - 正在尝试 CodeChef 挑战赛 "ATM" - 出现 SIGSEGV 运行时错误



我目前刚刚开始学习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想从自动取款机上取X$US。提款机会只有当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

SIGSEGV-段故障。这意味着程序的一部分实际上正试图从读取或写入程序无权访问的内存地址。

像在没有命令参数的情况下运行程序这样简单的操作可能会导致此操作系统错误,因为无法保证argv[1]argv[2]是允许读取的有效内存位置。CCD_ 3和CCD_ 4所包含的随机数几乎肯定不是CCD_ 5或CCD_。不确定你为什么要注释掉有效参数数的检查,因为这会保护你的程序不犯这个罪。

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

最新更新