c语言改错

[复制链接]
查看11 | 回复2 | 2016-1-25 20:14:36 | 显示全部楼层 |阅读模式
自编了一段程序,但结果和料想的不一样,当输入lin3时,本以为会显示“含无效字符,需要重新输入。请输入姓名。”但实际上显示了3和lin。请高手找错,谢谢!
代码如下:
#include
#include
#include
#include
#include
struct record *getname(void);
const int NAME_MAX=20;
struct record
{
size_t namelength;/*用于记录name数组中字符的个数*/
char name[NAME_MAX];/*用于存储名字*/
int age;/*用于存储年龄,但在该函数中暂时不用。*/
}student;
struct record * const precord=&student;
int main ()
{
struct record *pointer=getname();
if(pointer==NULL)
printf("指针无效");
printf("%u\n%s",precord->namelength,precord->name);
system("pause");
return 0;
}
struct record *getname()
{
fflush(stdin);/*刷新输入流*/
printf("请输入姓名:");
int index=0;/*数组name的索引值,永远指向数组中的下一个元素。*/
while(isalpha(precord->name[index]=getchar())&&precord->name[index]!='\n'&&index++!=NAME_MAX-1);/*用于输入名字,当遇到非字母的字符或遇到换行符或者存入的字符数超过数组的容量时循环结束。*/

if(!isalpha(precord->name[index-1]))
{
printf("含无效字符,需要重新输入。");
return getname();/*调用函数自己,直到正确输入。*/
}/*检查循环结束是否因为包含了非字母字符*/
if(indexname[index-1]!='\n')
{
printf("姓名太长,需要重新输入。");
return getname();
}/*检查循环结束是否因为字符数超过了数组容量*/
precord->name[index]='\0';
precord->namelength=strlen(precord->name);/*保存姓名长度*/
return precord;
}

回复

使用道具 举报

千问 | 2016-1-25 20:14:36 | 显示全部楼层
#include #include #include #include #include struct record *getname(void); const int NAME_MAX=20; struct record { size_t namelength;/*用于记录name数组中字符的个数*/ char name[NAME_MAX];/*用于存储名字*/ int age;/*用于存储年龄,但在该函数中暂时不用。*/ }student; struct record * const precord...
回复

使用道具 举报

千问 | 2016-1-25 20:14:36 | 显示全部楼层
将循环输入后面的那句话:if(!isalpha(precord->name[index-1])) 改为:if( precord->name[index] != '\n' && !isalpha(precord->name[index]) )即可...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行