【问题标题】:Having trouble comparing two strings in C在 C 中比较两个字符串时遇到问题
【发布时间】:2019-12-17 20:04:35
【问题描述】:

我试图通过 C 中的命令行参数接收两个字符串,然后比较它们。我知道malloc 返回一个void 指针,尽管我不明白如何将它传递给我的比较函数,因为它正在寻找一个const void 指针。我假设我将不得不强制转换指向将分配字符串的堆上的内存的指针(?)虽然我不确定如何去做,但感谢任何帮助。

int cmpstringp(const void *arg1, const void *arg2);

int main(int argc, char **argv) {
    char *strOne;
    char *strTwo;
    int n = 10;
    strOne = (char *)malloc((n + 1) * sizeof(char));
    strTwo = (char *)malloc((n + 1) * sizeof(char));
    strOne = argv[1];
    strTwo - argv[2];
    cmpstringp(strOne, strTwo);
}

int cmpstringp(const void *arg1, const void *arg2) {
    const char * const * ptr1 = (const char **)arg1;
    const char * const * ptr2 = (const char **)arg2;

    const char *str1 = *ptr1; 
    const char *str2 = *ptr2;

    return strcmp(str1, str2);
}

【问题讨论】:

  • 你可以直接比较argv[1]argv[2]strcmp(argv[1], argv[2])
  • 您不需要任何分配,因为在下一行您通过为变量分配另一个值来泄漏分配的内存。当它们只是指针时,也没有理由强制转换为双指针。只需按原样使用指针即可。
  • 您的代码中有strTwo - argv[2];,应该是strTwo = argv[2];,是输入错误还是您运行了它?
  • 所有 cmets/answers 都是正确的,但没有人说你做错了什么:1) strOne = argv[1]; 在你的情况下会导致内存泄漏。如果您想要一个副本,请使用 strdupstrcpy 到您分配的缓冲区中。 2)cmpstringp() 是一团糟。您将指针传递给它,然后将参数视为**
  • 您始终可以将指向非const 的指针传递给需要const 的函数。函数声明中的const只是表示它不会修改数据,即使参数数据是可修改的也很好。

标签: c pointers malloc


【解决方案1】:

看一下将strcmp直接应用到argv的返回值:

int main(int argc, char * argv[])
{
    int ret;

    ret = strcmp(argv[1], argv[2]);
    if (ret == 0)
        printf("Equal strings.\n");

    return 0;
}

顺便说一句,如果您希望有一个带有通用参数的函数来比较两个字符串(即在qsort() 中使用),您可以这样做:

int string_cmp(const void * a, const void * b)
{
     return strcmp((const char*)a, (const char*)b);
}

【讨论】:

  • if(strcmp(argv[1], argv[2]) == 0) 也可以使用,除非您通过电话获得报酬。 ;-)
  • 它会,但我想保留返回值以防万一您需要它进行字母排序或其他事情。不过还是谢谢你! :)
  • 为避免虚假警告,如果 C++ 兼容性有用,我建议return strcmp((const char *)a, (const char *)b);,否则建议return strcmp(a, b);
  • 非常感谢您的提示,这很有帮助:)
  • @Jackson 没问题 :) 如果您喜欢我的回答,请考虑接受。干杯!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-04
相关资源
最近更新 更多