老师要求输入"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把数组字符串转换成整数型,如果前辈们有更好的方法求教育~~
在gets(s2)之后的getnum函数里
另外由字符串转整型,sprintf应该可以直接传输在空格之后的那个数字字符开始的地址,进行转型。
你把指针推进一下应该就可以了,具体你自己查以下sprintf的使用就能理解应该。
然后,其实这个为什么要用gets呢,直接scanf("%s %d",s1),就结束了呀
这个问题想那么复杂干嘛?
你们老师的要求是格式为名字 空格 分数
你直接分析输入的字符串就可以了,字符串格式不符合就输出格式不符合,符合的话就登记