指针算术,指针相减
#include <iostream>
#include <ctype.h>
#include <string.h>
bool GetWord(char *theString, char *word, int &wordOffset);
int main()
{
const int bufferSize=255;
char buffer[bufferSize+1];
char word[bufferSize+1];
int wordOffset=0;
std::cout << "Enter a string: ";
std::cin.getline(buffer, bufferSize);
while (GetWord(buffer, word, wordOffset))
std::cout << "Got this word: " << word << std::endl;
return 0;
}
bool GetWord(char *theString, char *word, int &wordOffset)
{
if (theString[wordOffset]==0)
return false;
char *p1, *p2;
p1=p2=theString+wordOffset;
for (int i=0; i<(int)strlen(p1) && !isalnum(p1[0]); i++)
p1++;
if (!isalnum(p1[0]))
return false;
p2=p1;
while (isalnum(p2[0]))
p2++; //p2【0】开始,循环到不是字符或数字
int len=int (p2-p1); //P2[4]-P1[0]=4
strncpy(word, p1, len);
word[len]='\0';
for (int j=int(p2-theString); j<(int)strlen(theString) && !isalnum(p2[0]); j++)
p2++;
wordOffset=int(p2-theString);
return true;
}
[解决办法]
指针相减可以理解为两个指针相差了几个“位置”,这个位置差的意思就是指针对应的类型的几个元素。
如果是char*,因为一般一个char占一个字节,所以指针差是2就说明前后差2个位置,地址值的差也是2;
如果是int *,因为一般一个int占4字节,那么如果指针地址值相差8,实际的位置相差就是8/sizeof(int) = 2;直接用指针相减,编译器自动得出这个2,而不是实际的地址的差值
[解决办法]