【问题标题】:C Quicksort, ignore first character in a string?C快速排序,忽略字符串中的第一个字符?
【发布时间】:2020-03-20 07:30:36
【问题描述】:

我正在快速排序一个结构数组,这个结构有一个名为 ProcessName 的 char*。现在我已经使用我的比较函数使用 Qsort 按字母顺序对其进行了排序,但是如果 ProcessName 以 ( 开头,它将无法正确排序。

例如,“(ssh)”应该在“bash”之后,但是由于括号是第一个字符,括号在 bash 之前,此时它应该只考虑括号后面的字母。

现在我知道这是如何工作的了,检查第一个字符是否为 '(' 然后递增字符串,但这遇到了一些指针问题。

这是我的比较功能

int compare(const void *p1, const void *p2) {
    const process *first = p1;
    const process *second = p2;
    return strcmp(first->Processname, second->Processname);
}

【问题讨论】:

  • 只是( 需要跳过,还是任何非字母?
  • 任何非字母都可以,但是现在跳过 ( 就可以了。

标签: c sorting


【解决方案1】:

检查任一字符串的第一个字符是否为(。如果是,则增加指针以跳过它。

int compare(const void *p1, const void *p2) {
    const process *first = p1;
    char *name1 = first->Processname;
    if (name1[0] == '(') {
        name1++;
    }
    const process *second = p2;
    char *name2 = second->Processname;
    if (name2[0] == '(') {
        name2++;
    }
    return strcmp(name1, name2);
}

如需更通用的方式跳到第一个字母,请使用strcspn()

【讨论】:

  • 谢谢!我正在尝试与此非常相似的东西,效果很好
  • @Fireboy653:但不要忘记格式错误的输入。如果您在跳过时遇到字符串结尾0,您可能最好恢复到原始字符串。至少这样可以保证您的排序是稳定的。
猜你喜欢
  • 2015-11-01
  • 1970-01-01
  • 2014-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-11
相关资源
最近更新 更多