2016-02-20 40 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是一個內存地址是一個整數。