我写的C程序,请高手评点

hexuhui 2003-10-16 02:42:33

这是一个注册新用户的功能,里面的函数很多在C的函数库里面有,但是还是在尽量自己写。

#include <stdio.h>
#include <string.h>

struct student
{
/* 定义一个结构,用来存储学生的注册信息 */
char name[20];
int age;
char password[20];
};

int len(char *ptr)
{
/* 用来计算字符串长度的函数 */
int l=0;
while(*ptr++!='\0')
{
l++;
}
return l;
}

int valid_char(char *ptr)
{

/* 这个函数用来判断用户输入的用户名是否都是合法字符(仅限英文字母) */
int valid_char_count=1;
while (*ptr++!='\0')
{
if (
(*ptr>=65 && *ptr<=90)
||
(*ptr>='a' && *ptr<='z')
)
{
valid_char_count++;
}
}
return valid_char_count;
}


int checkUserName(char *ptr_username)
{
/* 检查用户名是否合法有效的函数,用户名无效时返回非0值 */

int valid_char_count=1;
if (len(ptr_username)<6)
{
return 2;
}
if (len(ptr_username)>10)
{
return 3;
}

if (len(ptr_username)!=valid_char(ptr_username))
{
return 4;
}

return 0;
}




int regNewUser()
{
/* 注册新用户的函数 */
struct student new_stu;
strcpy(new_stu.name,"");
while(checkUserName(new_stu.name)!=0)
{
printf("Please input your name:");
scanf("%s",new_stu.name);
}
}

void main()
{
regNewUser();
}

...全文
49 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
Wolf0403 2003-10-18
  • 打赏
  • 举报
回复
1、
int showMainMenu()
{
/* 显示主菜单并且返回用户的选择 */
int s;
printf("您要?\n");
printf("1.注册新用户\n");
printf("2.使用已经注册的用户名登陆\n");
//while (s!=49 && s!=50) // s 没有被赋值,怎么判断?!用 do 循环
//{
// s=getchar();
//}
do
{
scanf("%1d", &s);
}while ((s!=1) && (s!=2));
return s;
}

2、
下午贴了一个,被各位高手骂了一通,小弟感激不尽。
请各位高手继续批评下面的用户注册程序,主要从:
1.编程风格
2.程序结构
3.有无错误
两个方面 // 这是。。。2个方面?
静虚极 2003-10-18
  • 打赏
  • 举报
回复
int s;
printf("您要?\n");
printf("1.注册新用户\n");
printf("2.使用已经注册的用户名登陆\n");
^^^^^^^^^^^^^^^^^^^^^^^^
是否应该加多一个退出的选择??
chaonet 2003-10-18
  • 打赏
  • 举报
回复
xuexi
Bandry 2003-10-17
  • 打赏
  • 举报
回复
CsdnPlayer(公孙智多星) 真是不一般啊,佩服佩服!
should be:
switch (select)
{
case 1:
regist();
break; // 唉,不想每次都出一个Found error就加上它
default:
printf("Found error");
break;
}
regist()函数里面的while通通换成do { } while();否则,呵呵,就不说了

lxcc 2003-10-17
  • 打赏
  • 举报
回复
@_@
CsdnPlayer 2003-10-17
  • 打赏
  • 举报
回复
[1] switch (select)
{
case 1:
regist();
break;
default:
printf("Found error");

}
should be:
switch (select)
{
case 1:
regist();
default:
printf("Found error");
break;

}

[2] You had better not use Chinese-Character,such as '请再次输入您的密码'.

[3] while (s!=49 && s!=50)
{
s=getchar();
}
界面显示不清晰。

[4] others...
hexuhui 2003-10-17
  • 打赏
  • 举报
回复
大哥们 缩进我还是知道的 就是昨天下午几个粘贴以后就没有了。
的确,感觉数据结构比较弱,应该加强。



下午贴了一个,被各位高手骂了一通,小弟感激不尽。
请各位高手继续批评下面的用户注册程序,主要从:
1.编程风格
2.程序结构
3.有无错误
两个方面
#include <stdio.h>
#include <string.h>
struct stu_info
{
char UID[20];
int age;
char PWD[20];
};

int showMainMenu()
{
/* 显示主菜单并且返回用户的选择 */
int s;
printf("您要?\n");
printf("1.注册新用户\n");
printf("2.使用已经注册的用户名登陆\n");
while (s!=49 && s!=50)
{
s=getchar();
}
return s-48;
}

int checkUID(const char *UID)
{
/* 检查用户名的长度 将来会增加更多的检查条件 */
if (strlen(UID)<4 || strlen(UID)>10)
{
return 1;
}
else
{
return 0;
}
}

int checkPWD(const char *PWD, const char * confirmPWD)
{

/* 密码必须和确认密码箱等,这里没有直接返回strcmp的值是因为还要增加更多的密码验证条件 */

if (strcmp(PWD,confirmPWD)==0)
{
return 0;
}
else
{
return 1;
}
}


int regist()
{
struct stu_info newStudent;
char confirmPWD[20];
strcpy(newStudent.PWD,"");
newStudent.age=0;
strcpy(newStudent.UID,"");

while(checkUID(newStudent.UID)!=0)
{
printf("\n请输入您的姓名:");
scanf("%20s",newStudent.UID);
}


while (newStudent.age<5 || newStudent.age>100)
{
printf("\n请输入您的年龄:");
scanf("%d",&newStudent.age);
}


while (checkPWD(newStudent.PWD,confirmPWD)!=0)
{
printf("\n请输入您的密码:");
scanf("%s",&newStudent.PWD);
printf("请再次输入您的密码:");
scanf("%s",confirmPWD);
}
printf("\n注册已经完成...\n");
return 0;
}



void main()
{
int select=0;
select=showMainMenu(); /* 调用showMain函数显示菜单并返回用户的选择 */

switch (select)
{
case 1:
regist();
break;
default:
printf("Found error");

}
}
Weigehoho 2003-10-17
  • 打赏
  • 举报
回复
楼主,俺又来了
你如果从vb转c,那一定要注意
1.指针和数组
2.字符串
还有好多咚咚,但是我觉得以上两点最容易和vb混。
比如:
int *p=0;
*p=10;//这种程序会整死人的
还有
int *p;
double First,Sencond;
p=&First;
Sencond=*p;//这栋栋可不能乱用,丢信息了
还有好多
所以个人觉得你要首先注意以上两点,在听听其他高手的,我们共同学习

谢谢交流
yeyuboy 2003-10-17
  • 打赏
  • 举报
回复
comeon
bing_huo 2003-10-17
  • 打赏
  • 举报
回复
最明显的问题就是代码风格 没有缩进 如果程序写长了 读起来那种痛苦。。。
alei520 2003-10-17
  • 打赏
  • 举报
回复
比我的强多了
hexuhui 2003-10-17
  • 打赏
  • 举报
回复
汗颜!


1。网友Wolf0403(完美废人) 提到“想不通的是:既然有标准库,为什么不去重用已有的高效的、已经被完善的代码,而要自己写?”

原因主要是要锻炼自己编码的能力。

2.网友JetGeng(Geng) 提到“
(*ptr>=65 && *ptr<=90)
||
(*ptr>='a' && *ptr<='z')这里是不是重复了”

这里有个大小写的问题。

3. 数组可能越界的问题用
scanf("%20s",....解决是否可以?

4. qiuzhang(酋长) 提到“应该说,若已工作则很丢脸了!”

汗颜汗颜 我已经工作了 不过以前只用VB的,最近才看C的书

感谢大家的耐心看这么垃圾的程序,今后请多指教。





minghui000 2003-10-17
  • 打赏
  • 举报
回复
bashfulboy 2003-10-16
  • 打赏
  • 举报
回复
我再找一个严重错误:
int len(char *ptr)
{
/* 用来计算字符串长度的函数 */
int l=0;
while(*ptr++!='\0')
{
l++;
}
return l;
}

没有对参数的合法性进行校验,如果ptr=NULL,则整个程序就会coredump 哈哈
qiuzhang 2003-10-16
  • 打赏
  • 举报
回复
应该说,若已工作则很丢脸了!
qiuzhang 2003-10-16
  • 打赏
  • 举报
回复
1、变量命名不规范
2、返回值不可用数字,要用宏
3、算法弱
若是学生算不错了,若已经工作了,则只能算低级程序员
CsdnPlayer 2003-10-16
  • 打赏
  • 举报
回复
[1] int checkUserName()中的 int valid_char_count=1; 有什么用么?好像是die code.
[2] int valid_char()中的 int valid_char_count=1; should be 0 .
[3] Why noy use strlen() ?


iceandfire 2003-10-16
  • 打赏
  • 举报
回复
用户放哪了?建议和数据库连连看~~~~
Wolf0403 2003-10-16
  • 打赏
  • 举报
回复
想不通的是:既然有标准库,为什么不去重用已有的高效的、已经被完善的代码,而要自己写?
int valid_char(char *ptr)
{
int valid_char_count=1; // 这里为什么是 1 不是 0?
check_user_name 中同。

字符串的 !='\0' 都可以省略,因为 '\0' 就是 0,自然返回 false 的。可以写成:
int len(const char *ptr)
{
int l=0;
while(*ptr++)
l++;
return l;
}
或者更绝的:
int len(const char * ptr)
{
int l = 0;
for (; *ptr++; l++);
return l;
}
valid_char 中同。

用链表保存数据。只保存一个数据,基本是没有意义的。
heavenchang 2003-10-16
  • 打赏
  • 举报
回复
都是高手

努力呀!
加载更多回复(9)

69,364

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧