2016-02-20 37 views
-2

我正在学习C并正在研究函数strchr。我发现了下面的代码,它让我感到困惑。在c上对字符进行运算

/* strchr example */ 

#include <stdio.h> 
#include <string.h> 


int main(){ 

char str[] = "This is a sample string"; 
char * pch; 
printf ("Looking for the 's' character in \"%s\"...\n",str); 
pch=strchr(str,'s'); 

while (pch!=NULL) { 
    printf ("found at %d\n",pch-str+1); 
    pch=strchr(pch+1,'s'); 
} 
return 0; 
} 

具有以下输出

Looking for the 's' character in "This is a sample string"... 
found at 4 
found at 7 
found at 11 
found at 18 

可变PCH和阵列STR均为炭,这是为什么对它们进行运算时,它们变成整数。我感谢所有的帮助。

+0

删除了C++标签,因为C++答案是“不要那样做”。 –

+0

否。对指针执行算术意味着它仍然是一个指针。顺便说一句,'pch'和'str'都不是'char'。 –

+0

@BaummitAugen噢,来吧,它不像他们使用strtok。 –

回答

3

让我们讨论一下声明:

printf ("found at %d\n",pch-str+1); 

在这种算术情况下,你在指针char操作,所以这是典型的指针运算:

  • pch是类型char *
  • strchar[]类型,它衰减为非零她char *指针类型
  • pch-str技术上ptrdiff_t型的,有符号整数类型的别名(在你的情况long int

所以完整的表达,pch-str+1,是long int型也。

最后,您的printf语句使用格式说明符%d,该格式说明符需要int参数并将其输出为带符号的十进制数。

1

不,他们不成为整数

这是可以做到的指针以及整数和浮点数数学,所以,如果char str[] = "hello";,然后*(str+1)等于“E”,和*(str+N)是第一个后N个字符。

+0

嗨@ForceBru,当我试图打印字符'printf(“找到%c \ n”,pch-str + 1);'而不是整数我得到了下面的错误。 'structs_lists.c:25:5:warning:格式'%c'需要类型'int'的参数,但参数2的类型是'long int'[-Wformat =]'。我仍然困惑,为什么它说参数2的类型是long int? – user116064

+0

@ user116064,这是因为'pch-str + 1'是一个代表内存地址的指针,而且这个地址可能非常大,所以它存储在一个可以容纳它的类型中('size_t' - >'long int' )。如果你想打印它指向的字符,你应该把它放在圆括号中,并在它们前面加上一个星号(取消引用指针):'*(pch-str + 1)'。 – ForceBru

0

实际上,pch是一个指针。当你给一个指针添加一个常数时,它相当于一个数组。例如。 char *ptrptr[i]相当于ptr+i,也相当于i+ptr。这不是对char变量的算术运算,而是对字符指针进行算术运算。

确保任何类型的指针都是一个包含地址的整数。

0

C中有两种基本类型的数据类型,即整数类型和浮点类型。字符也属于只有一个字节(即8位)的整数类型。因此它也可以将整数值存储到255,因为2^8 = 256(0-255)。

希望这会有所帮助。

0

不,你正在做整数算术,你正在做指针算术。 pch是一个指针,pch +1意味着pch + 1 * sizeof(char)。这里是和strchr下述类型的

char *strchr(const char *str, int c). 

可以进一步了解和strchr here

0

在声明指针p的阵列[]的任何数据类型的然后p表示,其中p指向的地址。所以当我们做p + 1的时候,地址会增加一个字节或四个字节,因为根据p是指向char的指针或指向整数的指针。

在每种情况下,p是一个基本上是整数的地址。

所以当你做pch + 1 pch是一个内存地址是一个整数。