次のコードで、配列とポインターを使用して許可されていることと許可されていないことに問題があります。
#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;
}
次の 2 つのことが思い浮かびます。
v[] = {a,b,c,d}
を宣言した後に書き込めないのはなぜ*v[MAX]
ですか? 実際、私は簡単なテストを行いましたが、これでさえ許可されていません:
char v[MAX];
v[] = {'w','o','r','d','s'};
一方、char v[] = {'w','o','r','d','s'};
受け入れられます。何故ですか?
次に、マジック ナンバー (この場合は 4) を使用せずに for ループを書き直すにはどうすればよいでしょうか。strlen を色々使ってみたのですが、毎回エラーになってしまいます。私が思いつくことができる最善の方法はchar *k;
、ループ条件を宣言して変更するというやや不器用な解決策です
for(count = 0, k = v; *(k-1); ++count, ++k)
printf("%s",v[count]);
v 配列をループするもっと洗練された方法があるに違いありません。