【问题标题】:How to print specific data in c?如何在c中打印特定数据?
【发布时间】:2013-12-18 09:08:40
【问题描述】:

我有一个问题,当用户输入相同的 id 时,他们需要再次输入 name 和 id。 当用户输入相同的身份证号码时,我如何只要求用户输入身份证而不是姓名和身份证。请给我一些提示如何做到这一点。谢谢您的帮助!

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++;
}   

【问题讨论】:

  • 技术上,fflush(stdin); 是未定义的。使用你的程序就不需要了。
  • 至于您的问题,您是否尝试过围绕 id 和 check 的输入循环?
  • 为什么student_id是int数组?
  • @JoachimPileborg:在Windows 上,fflush(stdin) 在技术上由微软定义。事实上,我上周了解到,Linux 也是如此(对于输入流,fflush() 会丢弃任何已从底层文件获取但尚未被应用程序消耗的缓冲数据我>)。这也适用于 Mac OS X。 C 标准未定义行为; POSIX 也是如此。但在 2 个关键平台和一个重要平台上,fflush(stdin) 是定义和有用的行为。
  • 为什么是student_id[30]?一个学生可以拥有多少个 ID?

标签: c loops


【解决方案1】:

您必须使用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;,它应该在主目录的顶部。

【讨论】:

  • 他的“i”一个接一个地移动,并将名字放入“name[i]”,所以“Peter”和“Mary”会导致一个“PMary”字符串。
  • 我更改为 char 并使用 strcmp。实际上,我想缩写这个词。我的项目中需要 student_num 的名称
【解决方案2】:

您的问题是:您有一个结构 S 应该包含所有值。但是在 S 中,名称只有一个数组,而不是所有名称的字符数组数组。

也许你想要的是

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

struct student sarray[30];

【讨论】:

  • 谢谢!其实是我老师定义的两个数组的原始字符名。我一直在想为什么名字有两个数组。我很困惑所以我修改为一个数组。
【解决方案3】:

试试这个:

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++; }   

【讨论】:

  • 在“for i”循环中每次都会询问“学生人数”?
  • 只有当ID匹配时,要求用户再次输入相同的第i个值的ID...
  • 我试过这个,当用户输入相同的值时,它无法定义 id 是否相同
【解决方案4】:

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

例如:

  • 新 ID=10

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

为此,您可以使用qsortbsearch

【讨论】:

    【解决方案5】:
    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. 在询问学生姓名之前,在您的列表中搜索 0Student_Count 以查找匹配条目。如果找到,则用匹配的数据填写 local 的其余部分,跳过接下来的 2 步。

    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);

    【讨论】:

    • 感谢您的详细指导。我想问一个问题。因为我的项目有很多要求。我必须遵循。如果我先输入名称。我怎样才能只检查学生证?
    • @user3041923 假设第一个输入是名称 ID。如果输入的文本与较早的 ID 匹配,则它是一个 ID。如果文本看起来像一个 ID(其中包含数字且没有空格),那么它就是一个 ID(或任何您的标准)。如果文本看起来像一个名字(其中没有数字并且有空格),那么它就是一个名字。否则就是垃圾。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-16
    • 1970-01-01
    相关资源
    最近更新 更多