问题描述
老师要求输入'Tom 89'这种'姓名空格分数'的形式问题代码区域:连续三个gets(),第二个回车无法结束gets()
printf('s1:n'); z=gets(s1); printf('s2:n'); x=gets(s2); n1=getnum(z); getnum得到姓名长度 n2=getnum(x); int flag0=0; 如果s3跟s1、s2其中一个相同,重新输入s3 while (flag0==0) {printf('s3:n');c=gets(s3);n3=getnum(c);if (n3==n1) { if (!strncmp(s1,s3,n1)) {printf('wrong s3!nn'); }}else if (n3==n2){ if (!strncmp(s2, s3, n2)) {printf('wrong s3!n'); }}else flag0=1; }
代码写的各种蠢,也可能是其他地方哪里出问题了影响到了这里……这是全部代码,加了注释,请前辈指点…………T-T
char s1[10],s2[10],s3[10],*z,*x,*c;int n1,n2,n3;int dg1,dg2,dg3;char d1[10],d2[10],d3[10];求空格前姓名的长度int getnum(char *z){ int num; while (*z) {if (*z!=’ ’) { num++;}else break;} return num;};求空格后分数的长度int digi(char p1[]){ int dnum=0; int np=strlen(p1); int flag=0; for(int i=0;i<np;i++){if(p1[i]==’ ’){ flag=1;}if (flag==1&&p1[i]!=’0’) { dnum++;} } return dnum;}int main(){printf('s1:n'); z=gets(s1); printf('s2:n'); x=gets(s2); n1=getnum(z); n2=getnum(x); int flag0=0; while (flag0==0) {printf('s3:n');c=gets(s3);n3=getnum(c);if (n3==n1) { if (!strncmp(s1,s3,n1)) {printf('wrong s3!nn'); }}else if (n3==n2){ if (!strncmp(s2, s3, n2)) {printf('wrong s3!n'); }}else flag0=1; }把空格后的分数字符串转换成整数型(方法太笨了,请教更好的方法) dg1=digi(s1); dg2=digi(s2); dg3=digi(s3); for (int i=0; i<dg1; i++) {d1[i]=s1[n1+i]; } sprintf(s1, '%d',dg1); for (int i=0; i<dg2; i++) {d2[i]=s2[n2+i]; } sprintf(s2, '%d',dg2); for (int i=0; i<dg3; i++) {d3[i]=s3[n3+i]; } sprintf(s3, '%d',dg3);求平均分 double ave=(dg1+dg2+dg3)/3; printf('%lf',ave); }
把空格后方的分数比如88转换成整数型,我用的方法是存进另一个数组内(要先求分数长度,很麻烦,后来觉得可以用while(*p++)),然后sprintf把数组字符串转换成整数型,如果前辈们有更好的方法求教育~~
问题解答
回答1:在gets(s2)之后的getnum函数里
int getnum(char *z){ int num; while (*z) {if (*z!=’ ’) { num++; z++;//你的指针z没有推进,进死循环了;}else break;} return num;};
另外由字符串转整型,sprintf应该可以直接传输在空格之后的那个数字字符开始的地址,进行转型。你把指针推进一下应该就可以了,具体你自己查以下sprintf的使用就能理解应该。
然后,其实这个为什么要用gets呢,直接scanf('%s %d',s1),就结束了呀
回答2:这个问题想那么复杂干嘛?你们老师的要求是格式为名字 空格 分数你直接分析输入的字符串就可以了,字符串格式不符合就输出格式不符合,符合的话就登记