C++ C++;计算字符[]的指针值

C++ C++;计算字符[]的指针值,c++,C++,有人能告诉我这个程序在这里做什么吗 if (*p1 == '\0' || *p2 == '\0') { return (*p2 == '\0') - (*p1 == '\0'); } 如果程序将指针位置与空字符(最后一个字符)进行比较,是否正确 如果其中一个是这种情况,那么它返回位置为nullcharacter的指针p2的长度,从位置为nullcharacter的指针位置p1的长度中减去 以下是我的完整程序: #include <iostream> #inc

有人能告诉我这个程序在这里做什么吗

  if (*p1 == '\0' || *p2 == '\0') {
      return (*p2 == '\0') - (*p1 == '\0');
    }
如果程序将指针位置与空字符(最后一个字符)进行比较,是否正确 如果其中一个是这种情况,那么它返回位置为nullcharacter的指针p2的长度,从位置为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;
}
#包括
#包括
#包括
使用名称空间std;
int strcmp_ign_ws(常量字符*s1,常量字符*s2){
常量字符*p1=s1,*p2=s2;
整数计数(0);
while(true){
而(*p1!='\0'&(*p1='')p1++;
而(*p2!='\0'&(*p2=='')p2++;
如果(*p1='\0'| |*p2='\0'){
返回(*p2='\0')-(*p1='\0');
}
如果(*p1!=*p2){
计数+=(无符号字符)*p2-(无符号字符)*p1;
}
p1++;
p2++;
}  
返回计数;
}
int main(){
字符a[]=“你好”;
字符b[]=“你好”;
int结果(0);
结果=strcmp信号(a,b);

cout如果
p1
p2
中的任何一个指向字符串的末尾(零字符,
'\0'
),则它返回布尔表达式的差(
p2='\0'
p1='\0'

p1='\0'
这里表示指针指向字符串的末尾

这两个布尔值都将提升为
int
并进行减法运算,返回
0
1
-1

返回值
0
将意味着两个指针都指向字符串的末尾(即字符串相同)

其他值表示字符串不同(
1
表示字符串
p1
p2
长,
-1
表示
p2
p1
长)

另一方面,函数的其余部分似乎已损坏,
count
的值将永远不会在任何地方使用

也许你会感兴趣

编辑:假设您只希望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++;
    }
}
int strcmp\u ign\u ws(常量字符*p1,常量字符*p2){
while(true){
而(*p1='')p1++;
而(*p2='')p2++;
如果(*p1='\0'| |*p2='\0'){
返回(*p2='\0')-(*p1='\0');
}
如果(*p1!=*p2){
返回静态_-cast(*p2)-静态_-cast(*p1);
}
p1++;
p2++;
}
}
虽然这个解决方案应该有效,但正如Jerry Coffin所说,最好使用
std::string
。为了保持空白的语义忽略字符串比较,您可以简单地从两个字符串中删除所有空白,然后通过
std::string::compare()

比较它们(IMO)一个设计拙劣的函数——它试图返回两种完全不同的信息,如果它没有bug,能够真正执行预期的操作,那么返回的方式就会模棱两可

您正在查看的
return
语句将每个字符串中的字符与“\0”进行比较,以查看它是否位于至少一个字符串的末尾。如果它位于至少一个字符串的末尾,则返回-1、0或1以指示哪个字符串更长(忽略空白)。(-1=第二个字符串更长,1=第一个字符串更长,0=长度相同的字符串)

它还统计
count
中字符串中的不匹配项,并让代码返回不匹配项的计数(但实际上它无法做任何有用的事情,因为
while(true)
循环的唯一出口是通过第一个
return


至于如何做好大致相同的事情,很大程度上取决于代码的其余部分。对于大多数字符串,大多数代码可能应该使用
std::string
。而不是使用此代码生成的三向结果,您通常应该只使用
bool
结果来指示某个字符串a是否比某个字符串B长。Nearly唯一需要此三向结果的函数是
qsort
——如果使用该函数,通常应改为使用
std::sort
(并且它只需要
bool
结果).

否。
return
语句减去两个布尔表达式;不管这有什么好处。谢谢,但是我如何修改我的代码呢?“?谢谢,没有布尔方法,还有其他方法可以比较字符串和指针的长度吗?