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