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

C++count the pointer value of a character[]

本文关键字:指针 计算 字符 C++      更新时间:2023-10-16

有人可以告诉我程序在这里做什么吗?

  if (*p1 == '' || *p2 == '') {
      return (*p2 == '') - (*p1 == '');
    }

如果程序将指针位置与空字符(最后一个字符(进行比较,我是否正确如果是其中之一,那么它返回指针 p2 在位置空字符的长度,从指针位置 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 != '' && (*p1 == ' ')) p1++;
    while (*p2 != '' && (*p2 == ' ')) p2++;
    if (*p1 == '' || *p2 == '') {
      return (*p2 == '') - (*p1 == '');
    }
    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;
}

你在这里看到的是一个设计不佳的函数(IMO(——它试图返回两种完全不同的信息,如果它足够没有错误来实际执行似乎有意为之的事情,那么这种方式将是模棱两可的。

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

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

至于如何做好大致相同的事情,很大程度上取决于代码的其余部分。大多数代码可能应该对大多数字符串使用 std::string。通常,您不应该使用此代码生成的三向结果,而应该只使用指示某个字符串 A 是否比某个字符串 B 长bool结果.几乎唯一需要这个三向结果的函数是 qsort - 如果你使用它,你通常应该切换到使用 std::sort 代替(它只需要一个bool的结果(。

如果p1p2中的任何一个指向字符串的末尾(零字符,''(,则返回布尔表达式(p2==''p1==''(的差值。

此处p1==''表示指针指向字符串的末尾。

两个布尔值都将提升为 int 和减去,返回 01-1

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

其他值表示字符串不相同(1表示字符串p1长于p2-1表示p2p1长(。

附带说明一下,函数的其余部分似乎坏了,count的值永远不会在任何地方使用......

这个问题可能对你来说很有趣。

编辑:假设你只想要std::strcmp的功能忽略空格,那么你可以写这样的东西:

int strcmp_ign_ws(const char *p1, const char *p2) {
    while (true) {
        while (*p1 == ' ') p1++;
        while (*p2 == ' ') p2++;
        if (*p1 == '' || *p2 == '') {
            return (*p2 == '') - (*p1 == '');
        }
        if (*p1 != *p2) {
            return static_cast<int>(*p2) - static_cast<int>(*p1);
        }
        p1++;
        p2++;
    }
}

虽然这个解决方案应该有效,但你最好使用std::string,正如Jerry Coffin所说。为了保持此空格的语义忽略字符串比较,您可以简单地从两个字符串中删除所有空格,然后按std::string::compare()进行比较。