银行管理系统主函数循环异常及VS Code编译问题求助
银行管理系统循环输出异常问题修复与Stack Overflow提问指南
问题概述
开发银行管理系统时,添加主循环后输出出现混乱,无循环时运行正常。代码在GDP编译器下输出符合预期,但在VS Code中输出格式错乱。
不同环境输出对比
VS Code 输出
Enter Your Name : O
Enter Your Account Number : 1
Main Menu
- Deposit
- Withdraw
- Transfer
- Account Details
- Transaction Details
- Exit
Please Select The Desired Service
1Deposit
Please Enter the Amount To Be Deposited
10000
10000.000000 Have Been Deposited To Account 1
Balance : 10000.00-----
u
- Deposit
GDP编译器输出
Enter Your Name : O
Enter Your Account Number : 1
Main Menu
- Deposit
- Withdraw
- Transfer
- Account Details
- Transaction Details
- Exit
Please Select The Desired Service
1
Deposit
Please Enter the Amount To Be Deposited
10000
10000.000000 Have Been Deposited To Account 1
Balance : 10000.00Main Menu
- Deposit
- Withdraw
- Transfer
- Account Details
- Transaction Details
- Exit
Please Select The Desired Service
问题分析与修复方案
核心问题点
- 输出缺少换行符导致格式错乱:
deposit和transfer函数中,打印余额的语句未添加换行符,导致后续菜单输出直接拼接在余额行末尾,造成混乱。 - 函数返回值类型不匹配:
deposit函数声明为int类型,但未返回任何值,属于未定义行为,不同编译器处理逻辑不同。 - 条件判断的赋值错误:
transaction_details函数中,if (c=EOF)是赋值操作而非比较操作,会导致逻辑判断失效。 fgets读取的字符串包含换行符:输入用户名时,fgets会将回车换行符一并存入数组,导致打印账户信息时出现多余换行。
修复后的代码
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <conio.h> #include <string.h> // 新增头文件处理字符串 char client_name[20]; double deposit_amount=0; int account_number; double total_amount=0; double withdraw_amount=0; double transfer_amount=0; int trans_acc_number; void menu() { printf("------------------------------\n"); printf(" Main Menu\n"); printf("------------------------------\n"); printf("1) Deposit\n"); printf("2) Withdraw\n"); printf("3) Transfer\n"); printf("4) Account Details\n"); printf("5) Transaction Details\n"); printf("6) Exit\n\n"); } // 修改为void类型,匹配函数实际行为 void deposit() { time_t tm; time (&tm); FILE *ptr = fopen("Account.txt","a"); printf("Deposit\n"); printf("Please Enter the Amount To Be Deposited\n"); scanf("%lf",&deposit_amount); total_amount=total_amount+deposit_amount; printf("%f Have Been Deposited To Account %d\n",total_amount,account_number); // 添加换行符,避免后续输出拼接 printf("Balance : %.2f\n",total_amount); fprintf(ptr,"£%.3f Have Been Deposited To Account %d\n",total_amount,account_number); fprintf(ptr,"Date & Time of Transaction is %s\n",ctime(&tm)); fclose(ptr); } void withdraw() { time_t tm; time (&tm); FILE *ptr =fopen("Account.txt","a"); printf("Withddraw\n"); printf("Please Enter the Amount To Be Withdrawn\n"); scanf("%lf",&withdraw_amount); total_amount=total_amount-withdraw_amount; printf("£%f Have Been Withdrawn From Account %d\n",withdraw_amount,account_number); printf("Balance : %.3f\n",total_amount); fprintf(ptr,"£%.3f Have Been Withdrawn from Account %d\n",total_amount,account_number); fprintf(ptr,"Date & Time of Transaction is %s\n",ctime(&tm)); fclose(ptr); } void transfer() { FILE *ptr =fopen("Account.txt","a"); printf("Transfer\n"); printf("Enter Amount To Be Transfered : "); scanf("%lf",&transfer_amount); printf("\nEnter The Account Number : "); scanf("%d",&trans_acc_number); if (total_amount<transfer_amount) { printf("Insufficient Balance\n"); // 添加换行符 } else { total_amount=total_amount-transfer_amount; printf("Transfer Successful\n"); // 添加换行符,避免后续输出拼接 printf("Balance : %f\n",total_amount); fprintf(ptr,"£%f Have Been Transfered to Account %d\n",transfer_amount,trans_acc_number); fclose(ptr); } } void account_details() { printf("Account Details\n"); printf("Account Name : %s\n",client_name); printf("Account Number : %d\n",account_number); printf("Balance : £%.3f\n",total_amount); } void transaction_details() { FILE *ptr; ptr=fopen("Account.txt","r"); if (ptr == NULL) { // 新增文件打开失败判断 printf("Failed to open transaction file\n"); return; } char c = fgetc(ptr); // 修正为比较操作== if (c == EOF) { printf("No Transactions have been made\n"); } else { printf("Transaction Details\n"); while (c!=EOF) { printf("%c",c); c=fgetc(ptr); } } fclose(ptr); // 新增关闭文件,避免资源泄漏 } void last_details() { printf("Account Details\n"); printf("Account Name : %s\n",client_name); printf("Account Number : %d\n",account_number); printf("Balance : £%.3f\n",total_amount); } int main() { int cycle = 1; FILE *ptr = fopen("Account.txt","w"); if (ptr == NULL) { // 新增文件打开失败判断 printf("Failed to open account file\n"); return 1; } int mm_choice; printf("Enter Your Name : "); fgets(client_name,19,stdin); // 去掉fgets读取的换行符 client_name[strcspn(client_name, "\n")] = '\0'; fprintf(ptr,"\nName : %s\n",client_name); printf("\n"); printf("Enter Your Account Number : "); scanf("%d",&account_number); fprintf(ptr,"Account No.: %d\n",account_number); fclose(ptr); while (cycle ==1) { menu(); printf("Please Select The Desired Service\n"); scanf("%d",&mm_choice); switch (mm_choice) { case 1: system("cls"); deposit(); break; case 2: system("cls"); withdraw(); break; case 3: system("cls"); transfer(); break; case 4: system("cls"); account_details(); break; case 5: system("cls"); transaction_details(); break; case 6: system("cls"); last_details(); cycle = 0; break; default: printf("Please Enter A Valid Number.\n"); } } return 0; }
额外优化说明
- 新增文件打开失败判断,避免空指针操作;
- 在
transaction_details中新增文件关闭操作,防止资源泄漏; - 在
transfer的余额不足提示中添加换行符,保持输出格式统一。
Stack Overflow正确提问指南
- 精准描述问题:明确说明功能目标、异常表现(如“循环后主菜单输出拼接在余额行后”)、环境差异(VS Code使用的编译器版本、GDP编译器信息)。
- 提供最小可复现代码:剔除无关功能(如文件操作),只保留能复现问题的核心代码,降低排查难度。
- 完整展示输入输出:像你现在做的一样,提供不同环境下的完整输入和对应输出,清晰对比差异。
- 说明已尝试的方案:列出你已经做过的修改(如“根据评论调整了XX代码”)和修改后的结果,帮助回答者快速定位。
- 标注工具版本:说明VS Code版本、使用的编译器(如MinGW 8.1.0)、操作系统等环境信息。
内容的提问来源于stack exchange,提问作者Omar Ahmed
相关产品推荐
相关产品推荐

