C 或 C++。如何比较给定 char * 指针的两个字符串?

Posted

技术标签:

【中文标题】C 或 C++。如何比较给定 char * 指针的两个字符串?【英文标题】:C or C++. How to compare two strings given char * pointers? 【发布时间】:2011-01-20 18:46:33 【问题描述】:

我以两种方式对我的汽车数组进行排序。一年一个,如下所示。和另一个由制造。 Make is a char* 当我只有指向它们的指针时如何比较字符串?

int i, j;
for(i=0; i<100; i++)
    for(j=0; j<100-i; j++)
        if(carArray[i]!=NULL && carArray[j]!= NULL && carArray[j+1]!=NULL)
            if(carArray[i]->year > carArray[j+1]->year)
                swap(carArray[j], carArray[j+1]);
            
        
    

上述方法适用于 int 的(年)。如何使它适用于 char 指针?

【问题讨论】:

在一个不相关的说明:你知道冒泡排序是超级低效的,对吧? 在非常大的输入上,它是超级低效的。在较小的输入尺寸上,它实际上可以比更性感的类型更快,因为它实现起来非常简单。当然,对于小输入(比如这个),速度无论如何都不是问题。 但是如果你想对小的输入进行排序,你不妨使用插入排序,它的平均性能更好,即使它也是 O(n^2) 【参考方案1】:

在任何一种情况下,方式都是致电strcmp。如果你的字符串(出于某种奇怪的原因)不是 NUL 终止的,你应该改用strncmp

但是,在 C++ 中,如果您可以合理地避免它,您真的不应该在 char 数组中操作字符串。请改用std::string

【讨论】:

既然你在排序,std::sort 也是你的朋友。 cplusplus.com/reference/algorithm/sort 您只需要提供一个比较函数供 std::sort 使用。【参考方案2】:

我认为你需要使用 strcmp() 函数。

【讨论】:

【参考方案3】:

确保 char * 不为空,如果需要,请查找 stricmp() 函数以进行不区分大小写的比较。否则,使用 strcmp()。

char * 实际上表示每个字符串中第一个字符的内存地址。所以你真的不想比较指针的值,而是它们指向的内容。

【讨论】:

stricmp() 不是标准的:***.com/questions/1784767/… 我认为这是 Microsoft 特有的。 如果 stricmp() 不在您的库中,还要检查 strcmpi() 是否存在 strcasecmp()。具有该功能的东西将在那里。【参考方案4】:

如前所述,在 C 中它的 strcmp() 函数。在 C++ 中,您可以使用 compare() 函数。

C:

 char str1[10] = "one";
 char str2[10] = "two";

 if (strcmp(s, t) != 0) // if they are equal compare return 0

C++

 string str1 ("one");
 string str2 ("two");
 if (str1.compare(str2) != 0) // if they are equal compare return 0

【讨论】:

呃,不,你不应该在这里使用compare。这就是字符串上的== 运算符的用途。使用比较的唯一原因是当您关心一个字符串(按字母顺序)是否小于或大于另一个时。 @T.E.D. compare 函数进行数字(字符值)而不是字母比较。 IE。字符串的字典比较。【参考方案5】:

我当然假设这里你有汽车制造商的 char *

int i, j;
for(i=0; i<100; i++)
    for(j=0; j<100-i; j++)
        if(carArray[i]!=NULL && carArray[j]!= NULL && carArray[j+1]!=NULL)
            if(strcmp(carArray[i]->make, carArray[j+1]->make) == 0)
            
                //Do whatever here
            
        
    

您想与 0 进行比较,因为如果两个字符串之间没有差异,strcmp 将返回 0。 strcmp 需要两个 const char *。http://www.cplusplus.com/reference/clibrary/cstring/strcmp/

【讨论】:

【参考方案6】:

当你需要比较两个char指针时,你可以用通常的方式比较它们:使用比较运算符&lt;&gt;==等。

这种情况下的问题是您不需要比较两个字符指针。不过,您需要的是比较这些 char 指针所指向的两个 C 风格的字符串。为了比较 C 风格的字符串,你必须使用标准的strcmp 函数。

除此之外,在排序算法中处理空元素的方法似乎没有任何意义。想象一个包含交替空指针和非空指针的输入数组。很明显,您的排序算法永远不会对任何内容进行排序,因为您的 if 中的条件永远不会为真。您需要重新考虑对 null 元素的处理。当然,首先,您必须决定如何处理它们。忽略并留在原地?推到阵列的一端?还有什么?

【讨论】:

【参考方案7】:

strcmp() 将帮助您比较两个 char* http://www.cplusplus.com/reference/cstring/strcmp/?kw=strcmp

【讨论】:

【参考方案8】:

你真的应该使用qsort(在 C 中,#include &lt;stdlib.h&gt;)或std::sort(在 C++ 中,#include &lt;algorithm&gt;)而不是像这样的冒泡排序。如果它是 C++ 并且您接受 @TED 的建议使用 std::string 而不是原始 C 字符串,您甚至不必指定比较,因为将使用 &lt; 运算符并且会做正确的事情。

【讨论】:

以上是关于C 或 C++。如何比较给定 char * 指针的两个字符串?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 是不是将 char 指针视为 c 样式字符串?

如何检查给定的 c++ 字符串或 char* 是不是仅包含数字?

C++标准库 如何连接两个const char *类型字符串,并返回const char * 类型结果?

C语言 | C++万字总结下

在 C 和 C++ 中将 int 值转换为 char 指针差异

在 C++ 中使用指针初始化 char 数组或字符串