gpt4 book ai didi

c - 尝试 CodeChef 挑战 "ATM"- 出现 SIGSEGV 运行时错误

转载 作者:行者123 更新时间:2023-11-30 15:46:50 25 4
gpt4 key购买 nike

我目前刚刚开始学习 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

但问题摘要如下:

All submissions for this problem are available.

Pooja would like to withdraw X $US from an ATM. The cash machine will only accept the transaction if X is a multiple of 5, and Pooja's account balance has enough cash to perform the withdrawal transaction (including bank charges). For each successful withdrawal the bank charges 0.50 $US.

Calculate Pooja's account balance after an attempted transaction. Input

Positive integer 0 < X <= 2000 - the amount of cash which Pooja wishes to withdraw.

Nonnegative number 0<= Y <= 2000 with two digits of precision - Pooja's initial account balance. Output

Output the account balance after the attempted transaction, given as a number with two digits of precision. If there is not enough money in the account to complete the transaction, output the current bank balance. Example - Successful Transaction

Input: 30 120.00

Output: 89.50

Example - Incorrect Withdrawal Amount (not multiple of 5)

Input: 42 120.00

Output: 120.00

Example - Insufficient Funds

Input: 300 120.00

Output: 120.00

最佳答案

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

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

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

关于c - 尝试 CodeChef 挑战 "ATM"- 出现 SIGSEGV 运行时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17975686/

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