簡體   English   中英

在C中打印結構數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM