【问题标题】:For the entire students of the class, get their name, reg.no , stream and arrange their names alphabetically using unions对于班上的所有学生,获取他们的姓名 reg.no ,使用联合流并按字母顺序排列他们的姓名
【发布时间】:2021-06-17 21:35:23
【问题描述】:

所以我已经使用 union 尝试了这个问题,但是有一些我无法弄清楚的错误。 在这段代码中,我收到一个错误,上面写着“警告] 传递 'strcpy' 的参数 1 使指针从整数而不进行强制转换。”我不知道那是什么意思。请有人帮我解决这个问题... 所以代码如下:

#include<stdio.h>
#include<string.h>

union student
{
    char name[25],regno[10],stream[3];
}s[25];

int main()
{
    int i,n,j,temp;
    printf("How many number of students are there?");
    scanf("%d",&n);
    printf("\n");
    for(i=0;i<n;i++)
    {
          printf("Student Name: ");
          scanf("%s",&s[i].name);
          printf("Reg. No.: ");
          scanf("%s",s[i].regno);
          printf("Stream: ");
          scanf("\n %d",&s[i].stream);
          printf("\n");
    }
    for (i=0;i<n-1;i++)
    {
        for (j=0;j<n-1;j++)
        {
            if(strcamp(s[j].name,s[j+1].name)>0)
            {
                strcpy(temp,s[j].name);
                strcpy(s[j].name,s[j+1].name);
                strcpy(s[j+1].name,temp);
            }
        }
    }
    for (i=0;i<n;i++)
    {
        printf("%s\t%s\t%s\n",s[i].name,s[i].regno,s[i].stream);
    }
    return 0;
}

【问题讨论】:

  • 什么是strcamp()?你打算把union 变成struct 吗? scanf("\n %d",&amp;s[i].stream) 中的格式规范也错误。并删除前导换行符。
  • 您在strcpy(temp,s[j].name); 中询问的警告tempint temp。但是还有另一个问题,你交换的是名字而不是他们的其他细节:你应该交换整个struct

标签: c unions alphabetical-sort


【解决方案1】:

你的错误是用cmets写的,这里是最终代码。

#include<stdio.h>
#include<string.h>
#include <stdlib.h>

struct student
{
    char name[25],regno[10],stream[3];
}s[25];

int main()
{
    int i,n,j;
    char temp[128];
    printf("How many number of students are there?");
    scanf("%d",&n);
    printf("\n");
    for(i=0;i<n;i++)
    {
          printf("Student Name: ");
          scanf("%24s",s[i].name);
          printf("Reg. No.: ");
          scanf("%9s",s[i].regno);
          printf("Stream: ");
          scanf("%2s",s[i].stream);
          printf("\n");
    }
    for (i=0;i<n-1;i++)
    {
        for (j=0;j<n-1;j++)
        {
            if(strcmp(s[j].name,s[j+1].name)>0)
            {
                strcpy(temp,s[j].name);
                strcpy(s[j].name,s[j+1].name);
                strcpy(s[j+1].name,temp);
            }
        }
    }
    for (i=0;i<n;i++)
    {
        printf("%s\t%s\t%s\n",s[i].name,s[i].regno,s[i].stream);
    }
    return 0;
}

【讨论】:

  • scanf("%s",s[i].name); 值得像 scanf("%24s",s[i].name); 这样的宽度限制
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-31
  • 2021-06-14
  • 2020-11-09
  • 2011-10-12
  • 1970-01-01
  • 1970-01-01
  • 2021-01-15
相关资源
最近更新 更多