按字母顺序对字符串数组进行排序 C

新手上路,请多包涵

我正在尝试编写一个具有以下结构的程序:

 struct aPlayer {
  string name;  // name of player
  int wins;     // number of wins player has
};

struct aCompetition {
  string  name;                 // name of the match
  int     numPlayers;           // number of players in the club
  aPlayer player[10];           // list of players in this club
};

从那里我想编写一个函数,按名称按字母顺序对玩家进行排序。函数声明如下:

     void sortByName(aCompetition & c){}

注意:我想只使用 for 循环、while 循环和 if 语句来做到这一点。我认为比较这两个字符串的唯一方法是比较它们的 ASCII 值。我不知道该怎么做,所以任何输入都将不胜感激。谢谢!

原文由 Buffalo282 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 582
2 个回答

假设这是为了家庭作业(如果不是,那么自己做这件事会比仅仅看到答案对你有很大帮助),我只想给你一些建议来帮助你。

比较 ASCII 值:

 aPlayer player1, player2;
player1.name = "bill";
player2.name = "john";
if (player1.name[0] < player2.name[0])
{
    // True, in this case, because b is less than j on the ascii table.
}

http://www.asciitable.com 获取 ascii 值。我建议在玩家名称上使用 tolower(),因为大写字母的值低于小写字母。

如果第一个数字相等,请转到第二个数字:(这样做的一种方法。)

 aPlayer player1, player2;
player1.name = "alfred";
player2.name = "alvin";

// Find which name is shorter using .length() like player2.name.length()

// Loop through this next part for all aPlayers in aCompetition
for (int i = 0; i < shorterName.length(); i++)
{
    // Compare ascii values as I showed above.
    // If one is larger than the other, swap them.
}

原文由 Jish 发布,翻译遵循 CC BY-SA 3.0 许可协议

排序由标准库提供,在具有 operator< 的类型或其他类型(如果给定该比较器)上。您可以构建一个 string::operator< 执行词法比较。

 #include <algorithm>
void sortByName(aCompetition& c) {
    sort(&c.player[0], &c.player[c.numPlayers],
            [](const aPlayer& a, const aPlayer& b) {return a.name < b.name;});
}

如果您没有 C++11 lambda,那么您将使用仿函数。

 struct compareAPlayerByName {
    boolean operator()(const aPlayer& a, const aPlayer& b) {
        return a.name < b.name;
    }
};
void sortByName(aCompetition& c) {
    sort(&c.player[0], &c.player[c.numPlayers], compareAPlayerByName());
}

原文由 ephemient 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题