有人可以告诉我这个节目在做什么吗?
if (*p1 == '\0' || *p2 == '\0') {
return (*p2 == '\0') - (*p1 == '\0');
}
如果程序将指针位置与空字符(最后一个字符)进行比较,我是否正确
如果其中一个是这种情况,那么它返回指针p2在null字符位置的长度,从nullcharacter的指针位置p1的长度减去?
这是我的完整计划:
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int strcmp_ign_ws(const char *s1, const char *s2) {
const char *p1 = s1, *p2 = s2;
int count(0);
while (true) {
while (*p1 != '\0' && (*p1 == ' ')) p1++;
while (*p2 != '\0' && (*p2 == ' ')) p2++;
if (*p1 == '\0' || *p2 == '\0') {
return (*p2 == '\0') - (*p1 == '\0');
}
if (*p1 != *p2) {
count += (unsigned char)*p2 - (unsigned char)*p1;
}
p1++;
p2++;
}
return count;
}
int main() {
char a[] = "Hallo Weltt";
char b[] = "Hallo Welt";
int result(0);
result = strcmp_ign_ws(a,b);
cout << result << endl;
return 0;
}
答案 0 :(得分:1)
如果p1
或p2
中的任何一个指向字符串的末尾(零字符,'\0'
),则它返回布尔表达式的差异(p2=='\0'
和{{ 1}})。
p1=='\0'
这里表示指针指向字符串的结尾。
两个布尔值都将提升为p1=='\0'
并减去,并返回int
,0
或1
。
返回值-1
将意味着两个指针都指向字符串的结尾(即字符串是相同的)。
其他值表示字符串不相同(0
表示字符串1
长于p1
,p2
表示-1
比p2
长p1
1}})。
在旁注中,函数的其余部分似乎已损坏,count
的值永远不会在任何地方使用...
This question对您来说可能很有趣。
编辑:假设您只想要std :: strcmp的功能忽略空格,那么您可以编写如下内容:
int strcmp_ign_ws(const char *p1, const char *p2) {
while (true) {
while (*p1 == ' ') p1++;
while (*p2 == ' ') p2++;
if (*p1 == '\0' || *p2 == '\0') {
return (*p2 == '\0') - (*p1 == '\0');
}
if (*p1 != *p2) {
return static_cast<int>(*p2) - static_cast<int>(*p1);
}
p1++;
p2++;
}
}
虽然这个解决方案应该可以使用,但最好还是使用std::string
,因为Jerry Coffin说。要保持此空格的语义忽略字符串比较,您可以简单地从两个字符串中去除所有空格,然后按std::string::compare()
进行比较。
答案 1 :(得分:1)
你在这里所拥有的是(IMO)一个设计不佳的功能 - 它试图返回两种完全不同的信息,如果它没有足够的bug来实际做到看似已经存在的东西,那将是模棱两可的意图。
您正在查看的return
语句将每个字符串中的字符与'\ 0'进行比较,以查看它是否位于至少一个字符串的末尾。如果它位于至少一个字符串的末尾,则返回-1,0或1以指示哪个字符串更长(忽略空格)。 (-1 =第二个字符串更长,1 =第一个字符串更长,0 =字符串相同长度)。
它还计算count
中字符串中的不匹配,并且代码用于以返回不匹配的数量(但实际上无法做任何有用的事情,因为唯一的退出来自while (true)
循环是通过第一个return
)。
至于如何做好大致相同的事情,很大程度上取决于你的其余代码。对于大多数字符串,大多数代码应该使用std::string
。您应该通常只使用bool
结果来指示某个字符串A是否长于某个字符串B,而不是使用此代码生成的三向结果。几乎唯一需要此三向结果的函数是{ {1}} - 如果您正在使用它,则通常应切换为使用qsort
代替(并且只需std::sort
个结果)。