搜索

首页  >  问答  >  正文

c++ - 连续三个gets(),第二个回车无法结束gets()原因?把字符串中某一连续区域数字转换成整数型的好方法?

老师要求输入"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把数组字符串转换成整数型,如果前辈们有更好的方法求教育~~

PHP中文网PHP中文网2807 天前960

全部回复(2)我来回复

  • PHPz

    PHPz2017-04-17 13:16:02

    在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),就结束了呀

    回复
    0
  • 迷茫

    迷茫2017-04-17 13:16:02

    这个问题想那么复杂干嘛?
    你们老师的要求是格式为名字 空格 分数
    你直接分析输入的字符串就可以了,字符串格式不符合就输出格式不符合,符合的话就登记

    回复
    0
  • 取消回复