2013-06-20 63 views
0

我在與我和我不可以與下面的代碼數組和指針做的事情煩惱:K&R在交換功能陣列和指針有效輸入

#include <stdio.h> 
#define MAX 1000 

void swap (char *v[], int i, int j); 

main() { 

    int i = 1, j = 2; 
    int count; 

    char *a = "Bill ", *b = "went ", *c = "to the ", *d = "grocery store."; 
    char *v[MAX]; 

    v[0] = a; 
    v[1] = b; 
    v[2] = c; 
    v[3] = d; 

    printf("String before swapping elements at index %d and %d: \n",i,j); 
    for(count = 0; count < 4; ++count) 
     printf("%s",v[count]); 
    printf("\n"); 
    swap(v,i,j); 
    printf("String after swapping elements at index %d and %d: \n",i,j); 
    for(count = 0; count < 4; ++count) 
     printf("%s",v[count]); 
    printf("\n"); 

    system("Pause"); 
    return 0; 
} 

void swap (char *v[], int i, int j) 
{ 
    char *temp; 

    temp = v[i]; 
    v[i] = v[j]; 
    v[j] = temp; 
} 

兩件事情來介意:

爲什麼在聲明*v[MAX]之後我不能寫v[] = {a,b,c,d}?事實上,我做了一個簡單的測試,甚至這是不允許的:

char v[MAX]; 
v[] = {'w','o','r','d','s'}; 

char v[] = {'w','o','r','d','s'};被接受。這是爲什麼?

第二件事,我如何重寫for循環而不必使用幻數(在本例中爲4)?我嘗試過以各種方式使用strlen,但每次都遇到錯誤。我能想出的最好的是宣佈char *k;和改變環路條件

for(count = 0, k = v; *(k-1); ++count, ++k) 
    printf("%s",v[count]); 

的有些笨拙的解決方案肯定有必須通過V陣列更優雅的方式來循環?

回答

4

我該如何重新編寫for循環而不必使用幻數 (本例中爲4)?這樣做的

的一種方式,是給你迭代陣列,例如在添加special終止值(通常NULL

char *v[] = { a, b, c, d, NULL }; 

for(count = 0; v[count] != NULL; ++count) 
    printf("%s",v[count]); 
+0

謝謝,這作品!作爲一個側面問題,當我寫* [v] = {a,b,c,d}或{a,b,c,d,'\ 0'}或{a,b,c,d,NULL}時, strlen(v)給我3而不是4.爲什麼? – ericgrosse

+0

現在它給了我85的長度,儘管我根本沒有更改代碼......我討厭非確定性錯誤:/ – ericgrosse

+0

@ amalgam54。你不能使用'strlen(v)',它的行爲在你的情況下是不確定的。當你編譯這個時,你應該得到一個很大的警告(或者錯誤,取決於你的編譯器設置)。 'v'不是'char指針'(字符串),它是'char指針'(字符串)的數組。一個體面的編譯器會標記這個。 –

1
char *v[] = { a, b, c, d}; 
int size = sizeof(v)/sizeof(*v);//4