C语言新手求助:这段注册账号代码存在什么问题?
嘿,作为C语言新手能写出这样的注册逻辑已经很棒了!咱们来一步步拆解这段代码里的问题,帮你把它改得更健壮:
首先先把你的代码完整贴出来方便分析:
for(a=0;a<99;a++){ reg: system("cls"); printf(" ~~REGISTER AN ACCOUNT~~\n"); printf(" Desired Username: "); scanf("%s", &user[a].user); for(b=0;b<=a-1;b++){ if(strcmp(user[a].user,user[b].user)==0){ printf("USERNAME IS ALREADY TAKEN"); system("pause"); goto reg; } } printf(" Desired Password: "); scanf("%s", &user[a].pass); printf(" Personal/Company Name: "); scanf("%s", &user[a].name); printf(" Address/Location: "); scanf("%s", &user[a].address); printf(" Email..."); }
scanf传参错误:
你写的scanf("%s", &user[a].user);是典型的新手误区!如果user[a].user是字符数组(比如char user[50];),数组名本身就代表首元素的内存地址,完全不需要加&。加了&之后,传递的是整个数组的地址(类型不匹配),虽然可能侥幸运行,但会埋下内存错误的隐患。正确写法是:scanf("%s", user[a].user);密码、姓名、地址的
scanf都要去掉多余的&。goto导致逻辑混乱:goto语法合法,但很容易让代码变成“ spaghetti code ”(面条代码),新手很难维护。你可以把用户名重复检查的逻辑改成while循环,逻辑会清晰很多:int usernameTaken; do { usernameTaken = 0; system("cls"); printf(" ~~REGISTER AN ACCOUNT~~\n"); printf(" Desired Username: "); scanf("%s", user[a].user); for(b=0;b<=a-1;b++){ if(strcmp(user[a].user,user[b].user)==0){ printf("USERNAME IS ALREADY TAKEN\n"); system("pause"); usernameTaken = 1; break; } } } while(usernameTaken);scanf("%s")无法读取带空格的内容:%s会在遇到空格、换行时停止读取,如果用户输入姓名是“John Smith”、地址是“123 Main St”,你的代码只会存“John”和“123”,完全不符合需求。推荐用fgets读取带空格的字符串,记得处理末尾的换行符:printf(" Personal/Company Name: "); // 先清理之前scanf留下的换行符 while(getchar() != '\n'); fgets(user[a].name, sizeof(user[a].name), stdin); // 去掉fgets自动读取的换行符 user[a].name[strcspn(user[a].name, "\n")] = '\0';变量未声明:
在C99及以后的标准中,变量必须先声明后使用。你直接在for循环里用a和b,如果没提前写int a, b;,编译器会直接报错,记得在代码开头补上变量声明。平台依赖函数限制:
system("cls")和system("pause")是Windows专属命令,在Linux、MacOS上运行会直接报错。如果只针对Windows开发可以保留,但最好加上注释说明;如果想写跨平台代码,建议用其他方式实现清屏和暂停。缺少输入校验:
你没检查scanf的返回值,如果用户输入了非法内容(比如乱敲字符),scanf会失败,导致程序进入异常状态。可以加上简单的校验:if(scanf("%s", user[a].user) != 1){ printf("输入错误,请重新输入!\n"); system("pause"); // 清理输入缓冲区的垃圾内容 while(getchar() != '\n'); continue; }结构体定义缺失:
代码里用到了user[a].user、user[a].pass等成员,但没看到你的结构体定义。要确保你已经提前定义了类似这样的结构体数组:#define MAX_USERS 100 #define MAX_STR_LEN 100 struct Account { char user[MAX_STR_LEN]; char pass[MAX_STR_LEN]; char name[MAX_STR_LEN]; char address[MAX_STR_LEN]; char email[MAX_STR_LEN]; // 你代码写到了Email,记得补上这个成员 }; struct Account user[MAX_USERS];
内容的提问来源于stack exchange,提问作者Coco

