2016-04-03 78 views
-2

我正在學習C,並且在我的學習資料中遇到了這個函數。該函數接受一個字符串指針和一個字符,並計算字符串中的字符數。例如,對於字符串this is a stringch = 'i',函數將返回3,發生3次出現i的字母。瞭解while循環中的字符指針

我發現混淆的部分是在while循環中。我本來會期望讀取像while(buffer[j] != '\0')這樣的程序,它將循環遍歷每個元素j,直到它讀取一個空值。我沒有看到while循環中使用buffer的while循環如何工作,以及如何使用buffer++逐個字符地遞增程序,直到達到空值。我試圖使用調試,但由於某種原因它不起作用。提前致謝。

int charcount(char *buffer, char ch) 
{ 
int ccount = 0; 
while(*buffer != '\0') 
{ 
    if(*buffer == ch) 
     ccount++; 
    buffer++; 
} 
return ccount; 
} 

回答

0

buffer是指向一組字符,一個字符串或存儲緩衝區的指針,用於存放char數據。

*buffer將取消引用buffer處的值,作爲字符。這可以與空字符進行比較。

當您添加到buffer - 您要添加到地址,而不是它指向的值時,buffer++將地址加1,指向下一個字符。這意味着現在*buffer產生下一個字符。

0

在循環你遞增指針buffer,直到它指向空字符,此時你知道你掃描整個字符串。而不是buffer[j],這相當於*(buffer+j),我們正在增加指針本身。

當您說buffer++時,您將存儲在buffer中的地址加1。

一旦您內化指針的工作方式,此代碼比使用單獨索引掃描字符串的代碼更清晰。

+0

**第8行的** buffer ++ ** –

0

在C和C++中,數組按順序存儲,數組根據其首地址和長度存儲。

因此*緩衝區實際上是第一個字節的地址,並且與緩衝區[0]同義。正因爲如此,你可以使用buffer作爲一個數組,像這樣:

int charcount(char *buffer, char ch) 
{ 
    int ccount = 0; 
    int charno = 0; 
    while(buffer[charno] != '\0') 
    { 
     if(buffer[charno] == ch) 
      ccount++; 
     charno++; 
    } 
    return ccount; 
} 

注意這因爲字符串是空終止 - 如果你沒有在陣列由指着字符空終止它將繼續永久閱讀;你知道c知道陣列有多長的時候就會失去位。這就是爲什麼你會看到很多c函數向你傳遞一個指針和一個長度 - 指針告訴它數組的位置,並且你指定的大小告訴它要繼續讀多遠。

希望這會有所幫助。