【问题标题】:Convert code from C++ to C: `a+b > b+a` where a and b are `string`将代码从 C++ 转换为 C:`a+b > b+a` 其中 a 和 b 是 `string`
【发布时间】:2017-01-05 18:25:48
【问题描述】:

有谁知道如何将这一行从 C++ 转换为 C 编程语言? 我用 C++ 编写了这段代码,我想用 C 转换它。

bool compare(string a, string b)
{
return a+b > b+a;
}

这是qsort中的比较函数

我想通过“a+b > b+a”比较来解决这个问题:比如如果有4个整数123、124、56、90那么下面的整数可以做成“1231245690、1241235690、5612312490 , 9012312456, 9056124123" 等。实际上可以生成 24 个这样的整数。但有一点可以肯定的是,9056124123 是最大可能的整数。

【问题讨论】:

  • 你有什么尝试吗?
  • 要确定所需的结果,实际上不需要连接字符串!比较可以完全基于子串比较来运行。
  • 您可以通过循环手动逐个字符地比较它们,这比构造新字符串要快。只要a 击中'\0',您只需从b 继续。顺便说一句,这样的比较公式 (a+b b+a) 没有意义
  • 你还需要连接吗?如果一个字符串小于/相同/大于另一个字符串,它们的相互连接也会如此。请注意,比较字符串与比较数字不同:"124" > "1234"。也许您应该将它们实际转换为数字。
  • 将代码从 c++ 转换为 c == 将特斯拉转换为 T 型福特。为什么?

标签: c++ c


【解决方案1】:

如果你需要一个没有任何额外分配的代码,你可以试试:

#include <string.h>
int compare(const char* a, const char* b)
{
  int a_len = strlen(a), b_len = strlen(b);
  int min_len = (a_len < b_len) ? a_len : b_len;
  int result = strncmp(a, b, min_len);
  if (result != 0)
     return result;
  if (a_len == b_len)
    return 0;
  if (a_len < b_len)
    result = strncmp(b, b+a_len, b_len-a_len);
  else
    result = strncmp(a+b_len, a, a_len-b_len);
  if (result != 0)
     return result;
  if (a_len < b_len)
    result = strncmp(b+(b_len-a_len), a, a_len);
  else
    result = strncmp(b, a+(a_len-b_len), b_len);
  return result;
}

它最多进行 3 次字符串比较。返回值遵循strncmp的定义。

【讨论】:

    【解决方案2】:

    这将满足您的期望,无需任何连接:

    int compare(char *a, char *b)
    {
        char *p1, *p2;
        int i, len = strlen(a) + strlen(b);
    
        p1 = a;
        p2 = b;
        for (i=0;i<len;i++) {
            if (*p1 > *p2) {
                return 1;
            } else if (*p1 < *p2) {
                return -1;
            }
            p1++;
            p2++;
            if (!*p1) {
                p1 = b;
            }
            if (!*p2) {
                p2 = a;
            }
        }
        return 0;
    }
    

    指针p1p2 分别从ab 的开头开始,逐个字符进行比较,如果没有差异,则每个指针递增。当任一指针遇到空字节时,它会重新分配到另一个变量的开头以从那里继续。

    我们首先获取两个字符串的组合长度,然后多次循环。

    将两个数字的十进制表示处理为字符串实际上比将它们处理为整数更简单,因为后者需要确定十进制位数并相应地相乘。此方法也不受您可能使用的任何整数类型的限制。

    【讨论】:

      最近更新 更多