我在與我和我不可以與下面的代碼數組和指針做的事情煩惱: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陣列更優雅的方式來循環?
謝謝,這作品!作爲一個側面問題,當我寫* [v] = {a,b,c,d}或{a,b,c,d,'\ 0'}或{a,b,c,d,NULL}時, strlen(v)給我3而不是4.爲什麼? – ericgrosse
現在它給了我85的長度,儘管我根本沒有更改代碼......我討厭非確定性錯誤:/ – ericgrosse
@ amalgam54。你不能使用'strlen(v)',它的行爲在你的情況下是不確定的。當你編譯這個時,你應該得到一個很大的警告(或者錯誤,取決於你的編譯器設置)。 'v'不是'char指針'(字符串),它是'char指針'(字符串)的數組。一個體面的編譯器會標記這個。 –