不知道为什么会出现回车

不知道为什么结果会出现一个回车
题目
大家参加了期末考试,成绩出来后要对 n 个学生进行成绩汇总和排序。要求程序按成绩降序进行排序。在排序过程中对于成绩相同的学生,要按照输入数据的顺序进行排列。例如:有5名学生的成绩:
zhang1,90
zhang2,91
zhang3,99
zhang4,91
zhang5,98

则排序结果应该为:
zhang3,99
zhang5,98
zhang2,91
zhang4,91
zhang1,90

请注意例题中“zhang2”和“zhang4”的排列顺序。

输入:
第一行为将要输入的学生数量n
从第二行起后面连续 n 行数据,每行为一名学生的姓名(长度不超过20个字符,不包括空格),考试成绩(int)

输出:
排序后的结果。每行为一名学生的姓名和成绩。

img


#include<string.h>
#include <stdio.h>
#include <stdlib.h>
struct data
{  
    char name[100];
    int  grade;
};
 
typedef struct data DATA;
 
int main( )
{
    char ch,str[100];
    DATA b[100];
    int i,j,n,temp;
    scanf("%d",&n);
    for(i=0,j=0;i<n;i++,j=0)
    {
         ch = getchar();
        while(ch!=',')
        {
            b[i].name[j] = ch;
            j++;
            ch = getchar();
        }
        scanf("%d",&b[i].grade);
        
    }
    
    for(i=0;i<n-1;i++)
    {
        for(j=n-1;j>i;j--)
        {
            if(b[j].grade>b[j-1].grade)
            {
                temp = b[j].grade;
                b[j].grade = b[j-1].grade;
                b[j-1].grade = temp;
                strcpy(str,b[j].name);
                strcpy(b[j].name,b[j-1].name);
                strcpy(b[j-1].name,str);
            }
        }
    }
    for ( i=0; i<n; i++ )
    {
        printf("%s", b[i].name);
        printf(",");
        printf("%d\n",b[i].grade);
    }
}

输入的时候,把回车输入到name里面了

j++;
->
if (ch != '\r' && ch != '\n') j++;

代码修改如下,供参考:

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
struct data
{
    char name[20]; //100
    int  grade;
};

typedef struct data DATA;

int main( )
{
    char ch,str[100];
    DATA b[100], tmp;
    int i,j,n,temp;
    scanf("%d",&n);
    for (i = 0; i < n; i++) {
        scanf("%s", str);
        sscanf(str,"%[^,],%d",b[i].name, &b[i].grade);
    }
    for (i = n - 1; i > 0; i--){
        for (j = 0; j < i; j++){
            if (b[j].grade < b[j+1].grade)
            {
                tmp   = b[j];
                b[j]  = b[j+1];
                b[j+1]= tmp;
            }
        }
    }
    for (i = 0; i < n; i++)
        printf("%s,%d\n", b[i].name, b[i].grade);
    return 0;

#if 0   // 以下删除
    for(i=0,j=0;i<n;i++,j=0)
    {
        ch = getchar();
        while(ch!=',')
        {
            b[i].name[j] = ch;
            j++;
            ch = getchar();
        }
        scanf("%d",&b[i].grade);
        //getchar();
    }
    
    for(i=0;i<n-1;i++)
    {
        for(j=n-1;j>i;j--)
        {
            if(b[j].grade>b[j-1].grade)
            {
                temp = b[j].grade;
                b[j].grade = b[j-1].grade;
                b[j-1].grade = temp;
                strcpy(str,b[j].name);
                strcpy(b[j].name,b[j-1].name);
                strcpy(b[j-1].name,str);
            }
        }
    }
    for ( i=0; i<n; i++ )
    {
        printf("%s", b[i].name);
        printf(",");
        printf("%d\n",b[i].grade);
    }
#endif
}