问题描述:刚刚学的C语言,但是没有接触到goto语句,老师不允许程序中出现goto,请问应该怎么样修改,感谢大佬的帮助。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
void login(char *username,char*password);
void change_password(char *old_password);
int main(){
char username[1000] = "asdf";
char password[1000] = "123456";//username和password数组开这么大是为了避免操作指针的时候发生越界的问题
int mod = 0;//设定一个变量mod,用来让用户选择系统工作的模式
remake:
printf("\n");
printf("\t*******************************\n");
printf("\t***** 请输入你要选择的模式 ******\n");
printf("\t*********1.登录系统*************\n");
printf("\t*********2.修改密码*************\n");
printf("\t*********3.退出系统*************\n");
printf("\t*******************************\n");
printf("\n");
scanf("%d",&mod);//读入用户的选择
switch (mod){//使用switch来控制分支
case 1:
login(username,password);//向登录函数传入所给定的用户名和用户密码
goto remake;
break;
case 2:
change_password(password);
goto remake;
break;
case 3:
printf("\t再见,欢迎下次使用!");
return 0;
default:
printf("\t输入错误,重新输入\n");
goto remake;
break;
}
}
void login(char *username,char*password){//模块化程序设计的思路,这个是登录模块,单独来做个函数,传入的参数为主函数中给定的正确的用户名和密码
char name[1000];
char word[1000];
int n;
printf("\n");
printf("\t*******************************\n");
printf("\t********* 用户登录系统 *********\n");
printf("\t*******************************\n");
printf("\n\n");
printf("\t请输入用户名.\n");
printf("\t用户名:");
scanf("%s",name);
printf("\n");
if( strcmp(username , name) == 0){
printf("\t输入用户名.\n");
printf("\t输入密码:");
scanf("%s",word);
for(n = 0; n < 5; n++){
if( strcmp( password , word) == 0 ){
printf("\n");
printf("\t*******************************\n");
printf("\t********* 欢迎用户! *********\n");
printf("\t*********3.返回上一级界面*************\n");
printf("\t*******************************\n");
re:
int flag = 1;
scanf("%d",&flag);
if(flag == 3){
return ;
}else{
printf("\t******* 无效命令!请重新输入 ******\n");
goto re ;
}
printf("\n");
break;
}
else
{
printf("\t\t请重试!\n");
printf("\t密码:");
scanf("%s",word);
if( strcmp( password , word) == 0 )
{
printf("\n");
printf("\t*******************************\n");
printf("\t********* 欢迎用户! *********\n");
printf("\t*********3.返回上一级界面*************\n");
printf("\t*******************************\n");
re1:
int flag = 1;
scanf("%d",&flag);
if(flag == 3){
return ;
}else{
printf("无效命令");
goto re1;
}
printf("\n");
break;
}
}
}
}
else if( strcmp(username , name) != 0){
printf("\t用户名错误! 请重新输入!\n");
}
}
void change_password(char *old_password){
char temp_mima[1000],temp_mima1[1000],temp_mima2[1000];//三个字符串密码,原始密码,新密码1,新密码2
printf("请输入原来的密码:");
loop:scanf("%s",temp_mima);
while(1){
if(strcmp(temp_mima,old_password)==0){
printf("\n\n");
printf("\t*******************************\n");
printf("\t********* 密码正确! *********\n");
printf("\t*******************************\n");
printf("\t请输入新密码:\n");
scanf("%s",temp_mima1);
printf("\t请再次输入密码:\n");
scanf("%s",temp_mima2);
if(strcmp(temp_mima1,temp_mima2)==0){
printf("\t*******************************\n");
printf("\t*****修改密码正确!请牢记密码!******\n");
printf("\t*******************************\n");
printf("");
strcpy(old_password,temp_mima1);//用新的密码代替旧的密码,
return; //返回主函数
}else{
printf("\t*******************************\n");
printf("\t***两次输入的密码不一致!修改失败!***\n");
printf("\t*******************************\n");
printf("\t请输入原来的密码::");
goto loop; //实现用户输出错误密码了,重新输入密码 ,
getch();
return;
}
}
else{
printf("\t*******************************\n");
printf("\t*********输入的密码错误!**********\n");
printf("\t*******************************\n");
printf("\t请输入原来的密码::");
goto loop;
getch();
break;
}
}
}
我的回复:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
void login(char *username, char *password);
void change_password(char *old_password);
int main() {
char username[1000] = "asdf";
char password[1000] = "123456";//username和password数组开这么大是为了避免操作指针的时候发生越界的问题
int mod = 0;//设定一个变量mod,用来让用户选择系统工作的模式
while (1) { // 增加一个while循环
// remake: // 原式:去掉label
printf("\n");
printf("\t*******************************\n");
printf("\t***** 请输入你要选择的模式 ******\n");
printf("\t*********1.登录系统*************\n");
printf("\t*********2.修改密码*************\n");
printf("\t*********3.退出系统*************\n");
printf("\t*******************************\n");
printf("\n");
scanf("%d", &mod); //读入用户的选择
switch (mod) { //使用switch来控制分支
case 1:
login(username, password); //向登录函数传入所给定的用户名和用户密码
// goto remake; // 原式:去掉label
break;
case 2:
change_password(password);
// goto remake; // 原式:去掉label
break;
case 3:
printf("\t再见,欢迎下次使用!");
return 0;
default:
printf("\t输入错误,重新输入\n");
// goto remake; // 原式:去掉label
break;
}
}
}
void login(char *username, char
*password) { //模块化程序设计的思路,这个是登录模块,单独来做个函数,传入的参数为主函数中给定的正确的用户名和密码
char name[1000];
char word[1000];
int n;
printf("\n");
printf("\t*******************************\n");
printf("\t********* 用户登录系统 *********\n");
printf("\t*******************************\n");
printf("\n\n");
printf("\t请输入用户名.\n");
printf("\t用户名:");
scanf("%s", name);
printf("\n");
if ( strcmp(username, name) == 0) {
printf("\t输入用户名.\n");
printf("\t输入密码:");
scanf("%s", word);
for (n = 0; n < 5; n++) {
if ( strcmp( password, word) == 0 ) {
printf("\n");
printf("\t*******************************\n");
printf("\t********* 欢迎用户! *********\n");
printf("\t*********3.返回上一级界面*************\n");
printf("\t*******************************\n");
// re: // 原式:去掉label
while (1) { // 增加一个while循环
int flag = 1;
scanf("%d", &flag);
if (flag == 3) {
return ;
} else {
printf("\t******* 无效命令!请重新输入 ******\n");
// goto re ; // 原式:去掉label
}
printf("\n");
}
break;
} else {
printf("\t\t请重试!\n");
printf("\t密码:");
scanf("%s", word);
if ( strcmp( password, word) == 0 ) {
printf("\n");
printf("\t*******************************\n");
printf("\t********* 欢迎用户! *********\n");
printf("\t*********3.返回上一级界面*************\n");
printf("\t*******************************\n");
// re1: // 原式:去掉label
while (1) { // 增加一个while循环
int flag = 1;
scanf("%d", &flag);
if (flag == 3) {
return ;
} else {
printf("无效命令");
// goto re1; // 原式:去掉label
}
printf("\n");
}
break;
}
}
}
}
else if ( strcmp(username, name) != 0) {
printf("\t用户名错误! 请重新输入!\n");
}
}
void change_password(char *old_password) {
char temp_mima[1000], temp_mima1[1000], temp_mima2[1000]; //三个字符串密码,原始密码,新密码1,新密码2
// printf("请输入原来的密码:"); // 原式:移动到while循环内
// loop: // 原式:去掉label
// scanf("%s", temp_mima); // 原式:移动到while循环内
while (1) {
printf("请输入原来的密码:"); // 原式:移动到while循环内
scanf("%s", temp_mima); // 原式:移动到while循环内
if (strcmp(temp_mima, old_password) == 0) {
printf("\n\n");
printf("\t*******************************\n");
printf("\t********* 密码正确! *********\n");
printf("\t*******************************\n");
printf("\t请输入新密码:\n");
scanf("%s", temp_mima1);
printf("\t请再次输入密码:\n");
scanf("%s", temp_mima2);
if (strcmp(temp_mima1, temp_mima2) == 0) {
printf("\t*******************************\n");
printf("\t*****修改密码正确!请牢记密码!******\n");
printf("\t*******************************\n");
printf("");
strcpy(old_password, temp_mima1); //用新的密码代替旧的密码,
return; //返回主函数 // 原式:可以改为break;更好
} else {
printf("\t*******************************\n");
printf("\t***两次输入的密码不一致!修改失败!***\n");
printf("\t*******************************\n");
// printf("\t请输入原来的密码::"); // 原式:重复多余了
// goto loop; //实现用户输出错误密码了,重新输入密码 , // 原式:去掉label
// getch(); // 原式:多余
return; // 原式:可以改为break;更好
}
} else {
printf("\t*******************************\n");
printf("\t*********输入的密码错误!**********\n");
printf("\t*******************************\n");
// printf("\t请输入原来的密码::"); // 原式:重复多余了
// goto loop; // 原式:去掉label
// getch(); // 原式:多余
// break; // 原式:因为需要重复修改,所以,不能使用它中止while循环
}
}
}