[英]Printing an array of structs in C
我正在尝试打印包含两个字符串的结构数组。 但是我的打印功能不能打印两个以上的数组索引。 我不确定为什么,因为在我看来逻辑是正确的。
这是主要功能
const int MAX_LENGTH = 1024;
typedef struct song
{
char songName[MAX_LENGTH];
char artist[MAX_LENGTH];
} Song;
void getStringFromUserInput(char s[], int maxStrLength);
void printMusicLibrary(Song library[], int librarySize);
void printMusicLibraryTitle(void);
void printMusicLibrary (Song library[], int librarySize);
void printMusicLibraryEmpty(void);
int main(void) {
// Announce the start of the program
printf("%s", "Personal Music Library.\n\n");
printf("%s", "Commands are I (insert), S (sort by artist),\n"
"P (print), Q (quit).\n");
char response;
char input[MAX_LENGTH + 1];
int index = 0;
do {
printf("\nCommand?: ");
getStringFromUserInput(input, MAX_LENGTH);
// Response is the first character entered by user.
// Convert to uppercase to simplify later comparisons.
response = toupper(input[0]);
const int MAX_LIBRARY_SIZE = 100;
Song Library[MAX_LIBRARY_SIZE];
if (response == 'I') {
printf("Song name: ");
getStringFromUserInput(Library[index].songName, MAX_LENGTH);
printf("Artist: ");
getStringFromUserInput(Library[index].artist, MAX_LENGTH);
index++;
}
else if (response == 'P') {
// Print the music library.
int firstIndex = 0;
if (Library[firstIndex].songName[firstIndex] == '\0') {
printMusicLibraryEmpty();
} else {
printMusicLibraryTitle();
printMusicLibrary(Library, MAX_LIBRARY_SIZE);
}
这是我打印库的功能
// This function will print the music library
void printMusicLibrary (Song library[], int librarySize) {
printf("\n");
bool empty = true;
for (int i = 0; (i < librarySize) && (!empty); i ++) {
empty = false;
if (library[i].songName[i] != '\0') {
printf("%s\n", library[i].songName);
printf("%s\n", library[i].artist);
printf("\n");
} else {
empty = true;
}
}
}
我认为问题是由于以下原因引起的:在for循环外设置empty = true
,然后检查(!empty)
它将得出false
。 我很惊讶的是它如何打印两个索引。 您应该设置empty = false
因为您已经在函数调用之前检查了第一个索引。
逻辑有两种终止列表的方式:1)如果达到条目数,或2)如果任何条目为空。
我希望第二个条件是在您期望之前停止上市。 数组可能未按预期构建(我没有看过那部分),或者某些内容覆盖了早期或中期条目。
您给出的定义为:
typedef struct song
{
char songName[MAX_LENGTH];
char artist[MAX_LENGTH];
}Song;
后来,您写了if (library[i].songName[i] != '\\0')
,这真的很奇怪:为什么要用与lib相同的索引来索引歌曲名字符串? 因此,我自然希望您的打印功能为:
// This function will print the music library
void printMusicLibrary (Song library[], int librarySize) {
for (int i = 0; i < librarySize; i ++) {
printf("%s\n%s\n\n", library[i].songName,
library[i].artist);
}
}
请注意,您可以通过测试library[i].songName[0] != '\\0'
(请注意0)来跳过空的歌曲名称,但我认为最好不要将它们添加到列表中(空的歌曲名称会引起轰动?)
(如果决定解决此问题,请注意您还有另一个可疑的地方: if (Library[firstIndex].songName[firstIndex] == '\\0')
具有相同的模式)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.