2015-09-23 80 views
-6

爲什麼argvs會表現奇怪? 例如:C argv [2] ++ vs(char *)argv [2] ++?

這將按預期工作,打印第一個參數的第一個字符。

printf("%c", *argv[1]); 

然而,這將打印在ASCII表(又名「一大」代表爲數字)的字符而不是打印第一個參數的第2個字符:

printf("%c", *(argv[1] + 1); 

輕微修改將什麼都不做,完全相同的結果:

printf("%c", *(argv[1] + sizeof(char)); 

,有助於實際鑄造argv的唯一的事情[2]爲char *:

printf("%c", *((char*)(argv[1] +1)); 

這是怎麼發生的?我知道:

argv's type := char** argv 
and argv[1] == *(argv + 1) 
and argv[1]'s type should be char* 

但顯然它不是,因爲我需要施放它?這怎麼可能?它被聲明爲char **,但它的成員不是char * s?

+2

如果你想索引字符,爲什麼不'的argv [1] [0]','的argv [1] [1]'等? – crashmstr

+1

你在第二個片段中缺少''''。也許如果你修復它,它會按預期工作。更新:第三個。第四。 –

+1

向我們展示了令人驚訝的輸出的真實代碼, – pm100

回答

3

你的問題的前提是錯誤的。這個程序:

#include <stdio.h> 

int main (int argc, char *argv[]) { 
    printf("%c\n", *(argv[1] + 1)); 
    return 0; 
} 

的說法test運行,打印e,不u

+0

我會按照你在這裏的6年經驗,但我沒有想到,指出這個問題是錯誤的通常是一個答案。 – Barmar

+0

@Barmar它不是,但你不能在評論中做代碼格式。只要OP首先讀取它,我不在乎它是否被刪除:-P – hobbs

0

確保你的括號和解引用真的是你認爲他們的地方。如果argv[1]包含test,然後

* (argv[1] + 1) == 'e' 
(* argv[1] + 1) == 'u' 
^^
| | 
+-+- slight difference here