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

时间:2013-11-30 16:40:56

标签: c++

有人可以告诉我这个节目在做什么吗?

  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;
}

2 个答案:

答案 0 :(得分:1)

如果p1p2中的任何一个指向字符串的末尾(零字符,'\0'),则它返回布尔表达式的差异(p2=='\0'和{{ 1}})。

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

两个布尔值都将提升为p1=='\0'并减去,并返回int01

返回值-1将意味着两个指针都指向字符串的结尾(即字符串是相同的)。

其他值表示字符串不相同(0表示字符串1长于p1p2表示-1p2p1 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个结果)。