如何在c中打印特定数据?

时间:2013-12-02 15:38:16

标签: c loops

我有一个问题,当用户输入相同的ID时,他们需要再次键入name和id。 当用户键入相同的id号时,我怎样才能要求用户输入id而不是name和id.Please给我一些提示如何做到这一点。谢谢你的帮助!

struct student
{
    char student_name[30];          
    char student_id[10];            
    int student_course_num[20]; 
    int student_course[10];
};

int main()
{
int student_num;

printf("Enter the number of students:");
scanf("%d",&student_num);
fflush(stdin);
struct student S[student_num];
char TestForId[student_num][10];
int i,j,student_code=1;
for(i=0;i<student_num;i++)
{
    printf("Enter the name of student:");
    fgets(S[i].student_name,30,stdin);

    printf("Enter the Student ID (8 digits):");
    fgets(S[i].student_id,10,stdin);

    strcpy(TestForId[i],S[i].student_id);
    for(j=0;j<i;j++)
    {
    if(strcmp(TestForId[j],S[i].student_id)==0)
    {
        printf("The student id has already exit\n");
    }
    }
    student_code++;
}   

5 个答案:

答案 0 :(得分:1)

你的问题是:你有一个结构S,它应该包含所有值。但是在S中你只有一个数组用于名称,而不是所有名称的char数组数组。

也许你想要的是

struct student {
   char name[50];
   int id;
}

struct student sarray[30];

答案 1 :(得分:1)

试试这个:

for(i=0;i<StuNum;i++)
{
    printf("Number of Students %d:\n",student_code);
printf("Enter the name of student:");
scanf("%s",&S.student_name[i]);
fflush(stdin);
printf("Enter the Student ID :");
scanf("%d",&S.student_id[i]);
fflush(stdin);
for(j=0;j<i;j++)
{
    if(S.student_id[j]==S.student_id[i])  //whether the id is same or not
    {
        printf("<ID NUMBER HAS ALREADY EXITED>\nEnter the ID again: ");
       scanf("%d",&S.student_id[i]);
        break;
    }
}
student_code++; }   

答案 2 :(得分:1)

  1. 创建一个struct student数组,而不只是一个条目。 struct student S[Student_N];

  2. 创建已使用记录的计数。 size_t Student_Count = 0;

  3. 在学生姓名之前先询问学生证。

  4. 将学生ID(以及后来的学生姓名)读入本地struct student local;scanf("%29s", local.student_id);使用宽度sizeof(local.student_id) - 1

  5. 在询问学生姓名之前,请在列表0中搜索Student_Count以查找匹配的条目。如果找到,请使用匹配的数据填写本地的其余部分,跳过接下来的两个步骤。

  6. 将学生姓名读入本地struct student local;scanf(" %49[^\n]", local.student_name);。使用格式说明符扫描第一个和第一个之间的空格。姓氏。

  7. local复制到student_id[Student_Count++]

  8. 不确定您是否需要student_num字段。 S[Student_N]的索引是student_num

  9. 检查scanf()中的结果,如if (scanf("%29s") != 1) Handle_Error();

  10. 删除fflush(stdin);

答案 3 :(得分:0)

您必须使用strcmp代替if(S.student_id[j]==S.student_id[i])

类似的东西:

if(0 == strcmp(S.student_id[j],S.student_id[i]))

有关strcmp的更多信息:Here

id也不应该是一个int数组而是一个char数组(字符串对吗?)

我真的不喜欢你的int StuNum=S.student_num;它应该位于主要的顶部。

答案 4 :(得分:0)

我会创建一个struct数组,其中每个元素都是一个包含ID和名称的结构。然后我会保持数组ID的排序,这样就可以很容易地检查ID是否存在。

e.g:

  • 新ID = 10

  • 数组中最大的ID是7(此信息是已知的,因为
    数组已排序)因此无需进一步检查,只需添加一个
    新ID

为此,您可以使用qsortbsearch