2012-07-17 50 views
3
int main(int argc, char* argv[]) 
{ 
    int i,s; 
    s=0; 
    char*p; 
    for(i=1; i<argc;i++) 
    { 
     for (p=argv[i];*p;p++); 
     s+=(p-argv[i]); 
    } 
printf("%d\n",s); 
return 0; 
} 

我很難理解這段代碼的作用。這個程序基本上做什麼?減指針?

據我所知,它忽略了程序的名稱,並且在命令行中打印的每個其他字符串都將p設置爲當前字符串。

  1. 條件*p說:「只要它不NULL,即直到你已經達到了字符串的結尾?
  2. 在每次迭代s總和當前p的減法,其餘的p旅遊這個詞,用的argv[i]的名字,這是什麼減法的結果呢?這是兩個ASCII值的減法?
  3. 這是什麼節目基本上做?
+2

您可以通過在調試器中運行該程序或通過添加打印語句來檢查變量的中間值來回答所有這些問題。 – 2012-07-17 14:02:55

+0

準備基本輸入。之後,打印出所有的argv,初始化p&i。爲了獲取更多信息,請在嵌套循環中打印。你會得到答案。或者,使用gdb – 2012-07-17 14:05:55

+0

確定參數字符串的總長度。 – BLUEPIXY 2012-07-17 14:06:09

回答

2

到回答這個問題的關鍵是要理解這種表達的意思:

p-argv[i] 

這是一個指向減法表達式,其被定義爲指針在第一個和第二個指針之間指向的元素大小的距離。當兩個指針都指向已被分配爲連續塊的內存區域(對於所有C字符串以及特別是argv[]的元素都是如此)時,這是有效的。

指針p首先前進到字符串的末尾(注意分號;在循環,這意味着循環體是空的端部),然後argv[i]被減去。結果是相應參數的長度。

+0

循環以分號結尾。聲明'+ =(p-argv [i]);'只運行一次 – 2012-07-17 14:12:17

+0

@AndyStowAway是的,我在一讀時錯過了分號。感謝您的更正! – dasblinkenlight 2012-07-17 14:13:36

+0

@andy沒有循環以前面的分號結束(p = argv [i]; * p; p ++);編輯:懷念你的回答 – bigkm 2012-07-17 14:14:31

1

此代碼計算程序的參數長度的總和(字符串)

1

它告訴你傳遞給程序的所有參數的總字符串長度。

在你點(2),它只是減去字符串的起始地址與持有\0字符

0

它採用指針的地址在倒退式的方法來計算所有ARGS總字符地址。

for (p=argv[i];*p;p++); //sets p to the address of argv[i]'s \0 terminator 
    s+=(p-argv[i]);  // p minus the address of the start of argv[i] accumulated to s