2012-03-25 76 views
3

假設我有char **argv雙指針字符操作

首先,我如何打印出argv中的所有字符串?我試過如下:

char *temp; 
temp = *argv; // Now points to the first string? 
while (temp != NULL) { 
    printf("%s ", temp); 
    temp++; 
} 

在這裏,當temp遞增,僅跳過一個字符。爲什麼會發生?我知道argv是一個擁有積分的數組。每個指針指向一個數組char*。如果是這樣,爲什麼這不起作用?我知道因爲tempchar類型,遞增該指針會使其增加1 char(或字節)。如果是這樣,我怎樣才能將指針增加到下一個數組中並將該字符串打印出來?

回答

6

它跳過只有一個字符,因爲temp是一個指向char。通過添加一個,您告訴編譯器將指針移動到指向內存中的下一個char

argv是一個指針數組。你需要做的是在每次迭代時轉到下一個指針。喜歡的東西:

char **temp = argv; // temp is a pointer to a *pointer*, not a pointer to a *char* 
while (*temp != NULL) { 
    printf("%s ", *temp); 
    temp++; 
} 
6

您需要增加argv而不是*argv。與本地副本,這看起來像這樣:

for (char ** p = argv; *p; ++p)  // or "*p != NULL" 
{ 
    char * temp = *p;    // now points to the first string! 
    printf("%s ", temp);    // or just "printf("%s", *p);" 
} 
+0

是否爲argv null的最後一個元素?我預計這將運行在數組的末尾。 – Collin 2012-03-25 13:58:11

+4

@CollinHockey:是的,標準要求。參見C99標準的5.1.2.2.1。 – 2012-03-25 13:58:41

+0

@Collin曲棍球:我會假設這是OP的流產嘗試,也是因爲看不到其他明顯的終止條件。奧利:OP沒有說我們正在處理標準的「主要」論點,但我們都假裝我們這樣做。 – 2012-03-25 13:58:52

1

首先,你需要了解什麼是char** argv。它是一個char指針數組。這個數組中的指針不一定駐留在地址空間中的任何地方。你想要的是:

char** temp; 
temp = argv; 
while(temp != argv + argc) { 
    printf("%s ", temp); 
    temp++; 
} 

你需要一個指向數組第一個元素的指針指向char。改爲增加。

+0

沒有'argc'。這不是標準的主要論點。 – darksky 2012-03-25 14:03:43

0

您必須增加argv而不是*argv。請注意,如果您argvmain函數的參數,它是可以修改的,你可以使用它像這樣:

while (*argv++) { 
     printf("%s\n", *argv); 
    } 
+0

這有效,但有點破壞性。 – 2012-03-25 14:01:53

+0

如果他只需要打印字符串值,這是最緊湊的形式。 – ouah 2012-03-25 14:05:06

0

你可能想要做的是這樣的:

char* a = argv[0]; // first arg 
char* b = argv[1]; // second arg 
char* c = argv[2]; // third arg 

這相當於這:

char* a = *(argv + 0); 
char* b = *(argv + 1); 
char* c = *(argv + 2); 

然後,你會想要概括成一個循環。