Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
运行有两个结构和枚举常量的c程序时出现问题_C - Fatal编程技术网

运行有两个结构和枚举常量的c程序时出现问题

运行有两个结构和枚举常量的c程序时出现问题,c,C,问题是我们有两个结构 第一个结构应该有这些成员(称为title的字符串,长度为15个字符,称为double-called-length,类型为enum-genres,其中一种类型为枚举常量布鲁斯、嘻哈、爵士、乡村、电子、摇滚等) 第二个结构应该有(名为title的字符串长度为20个字符,名为artist的字符串长度为30个字符,名为song的成员类型为song,最多包含4首歌曲,最后一个成员是名为c的整数变量,用作歌曲数的计数器。) 结构歌曲必须别名为歌曲。 结构相册必须别名为相册 我的程序是这

问题是我们有两个结构

第一个结构应该有这些成员(称为title的字符串,长度为15个字符,称为double-called-length,类型为enum-genres,其中一种类型为枚举常量布鲁斯、嘻哈、爵士、乡村、电子、摇滚等)

第二个结构应该有(名为title的字符串长度为20个字符,名为artist的字符串长度为30个字符,名为song的成员类型为song,最多包含4首歌曲,最后一个成员是名为c的整数变量,用作歌曲数的计数器。)

结构歌曲必须别名为歌曲。
结构相册必须别名为相册

我的程序是这样的

enum genres { Blues = 0, HipHop, Jazz, Country, Electronic, Rock, Other};

struct song {
  char title[15];
  double length;
  enum genres genre;
};

typedef struct song Song;
struct album { 
char title[20];
char artist[30];
Song songs[4];
int noOfSongs;
};
typedef struct album Album;
现在我遇到了问题,因为问题是。 拥有:

  • getAlbum
    函数,该函数将唱片集指针作为参数,提示用户输入唱片集标题和艺术家姓名
  • getSong
    函数,该函数将唱片集指针作为参数,提示用户输入歌曲标题、歌曲长度和歌曲类型
  • printAlbum
    函数此函数显示用户提示的信息
  • 请注意,相册中的歌曲数量最多为4首

    我提出了这些函数原型

    void getAlbum( Album *aPtr);
    void getSong( Album *sPtr);
    void printAlbum( Album *pPtr);
    

    我在函数和实现方面有问题,而且我不确定我的enum和struct相册是否正确,因为我无法访问它们

    由于编译器总是将一个类型填充为4字节的倍数(char=1字节),因此您的缓冲区可以使用该空间而无需任何额外成本。无论如何,您需要它来终止
    '\0'
    字符。顺便说一句,如何缩短定义

    typedef enum { Blues, HipHop, Jazz, Country, Electronic, Rock, Other} Genre;
    
    typedef struct {
      char title[16];
      double length;
      Genre genre;
    }
    Song;
    
    typedef struct { 
      char title[21];
      char artist[31];
      Song songs[4];
      int noOfSongs;
    }
    Album;
    
    您当然可以编写
    typedef结构相册{…}相册
    如果你也需要名字
    struct album
    ,但我看不出你有什么理由这么做。以下是功能:

    void getAlbum(Album *aPtr) {
      printf("Album: ");
      scanf("%20s", aPtr->title);
      printf("Artist: ");
      scanf("%30s", aPtr->artist);
      int no = -1;
      while(no < 0 || no > 4) {
        printf("Tracks: ");
        scanf("%d", no);
      }
      aPtr->noOfSongs = no;
      for(int i = 0; i < no; ++i) getSong(&aPtr->songs + i);
    }
    
    void getSong(Song *sPtr) {
      printf("Song: ");
      scanf("%15s", sPtr->title);
      double len = -1;
      while(len < 0 || len > 100) {
        printf("Length: ");
        scanf("%f", len);
      }
      char genre[16];
      int genreNo = -1;
      while(genreNo == -1) {
        printf("Genre: ");
        scanf("%15s", genre);
        if(strcmp(genre, "Blues") == 0) genreNo = 0;
        else if(strcmp(genre, "Hip Hop") == 0) genreNo = 1;
        ...
        else genreNo = 6;
      }
      sPtr->genre = (Genre)genreNo;
    }
    
    void printAlbum(Album *aPtr) {
      printf("Album: %s\nArtist: %s\n", aPtr->title, aPtr->artist);
      for(int i = 0; i < aPtr->noOfSongs; ++i) printSong(&aPtr->songs + i);
    }
    
    void printSong(Song *sPtr) {
      printf("\tSong: %s\n\tLength: %.2f\n\tGenre: ", sPtr->title, sPtr->length);
      switch(sPtr->genre) {
        case Blues: printf("Blues\n"); break;
        case HipHop: printf("Hip Hop\n"); break;
        ...
        default:  printf("Other\n"); break;
      }
    }
    
    void getAlbum(Album*aPtr){
    printf(“相册:”);
    scanf(“%20s”,aPtr->title);
    printf(“艺术家:”);
    scanf(“%30s”,aPtr->artist);
    int no=-1;
    而(no<0 | | no>4){
    printf(“轨道:”);
    scanf(“%d”,否);
    }
    aPtr->noOfSongs=否;
    对于(inti=0;isongs+i);
    }
    作废getSong(歌曲*sPtr){
    printf(“宋:”);
    scanf(“%15s”,sPtr->title);
    双透镜=-1;
    而(len<0 | | len>100){
    printf(“长度:”);
    scanf(“%f”,len);
    }
    字符类型[16];
    int genreNo=-1;
    而(genreNo==-1){
    printf(“流派:”);
    scanf(“%15s”,体裁);
    如果(strcmp(体裁,“蓝调”)==0)genreNo=0;
    否则如果(strcmp(体裁,“嘻哈”)==0)genreNo=1;
    ...
    else-genreNo=6;
    }
    sPtr->流派=(流派)genreNo;
    }
    作废打印相册(相册*aPtr){
    printf(“相册:%s\n作者:%s\n”,aPtr->title,aPtr->artist);
    对于(inti=0;inoOfSongs;++i)printSong(&aPtr->songs+i);
    }
    无效打印歌曲(歌曲*sPtr){
    printf(“\tSong:%s\n\t长度:%.2f\n\t长度:”,sPtr->title,sPtr->length);
    开关(sPtr->类型){
    案例蓝调:printf(“蓝调”);break;
    案例嘻哈:printf(“嘻哈”);break;
    ...
    默认值:printf(“其他”);中断;
    }
    }
    
    实现函数实际上相当简单。您已经获得了原型,因此只需添加括号即可获得基本函数:

    void getAlbum(Album *aPtr) {
    
    }
    
    当然,这还不行,所以让我们从一个简单的提示开始:

    void getAlbum(Album *aPtr) {
        printf("Enter the album name: ");
    }
    
    现在将显示文本,但不会要求实际文本。要做到这一点,还有几种不同的方法。我将在这里使用
    scanf()
    ,尽管该工具只应用于测试目的和(可能)内部工具,因为它可能非常棘手,并且容易出错(例如,如果输入垃圾)

    好了。只需将其展开,即可读取所需的所有值。对于
    getSong()
    函数也是如此


    然后,打印所有内容都会非常相似,只是将成员作为
    printf()
    的参数传递,而不是
    scanf()

    首先,请记住,至少要比所需字符串长度多添加一个字符,以允许使用空终止字符。
    流派
    不应该是
    相册
    的属性,而不是
    歌曲
    ?您遇到了什么问题?@VoidPointer此网站的用户通常不依赖textspeak。这里没有人按角色付费,你可以完整拼写单词。@PhilipDahnen我认为用歌曲来拼写更有意义。你可以在同一张专辑中有不同风格的歌曲,特别是如果是编译的话。你好,Philip thanx,谢谢你的帮助,但是当我为line while(no--)getSong(aPtr->songs[4-no])编译程序时仍然有一些错误;为了帮助我,getSongHi Mario thanx的参数1得到了一个不兼容的类型。
    void getAlbum(Album *aPtr) {
        printf("Enter the album name: ");
        scanf("%19s", aPtr->title); // read up to 19 characters as a (s)tring; the 20th will be the terminator ('\0')
    }