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