0

次のコードで、配列とポインターを使用して許可されていることと許可されていないことに問題があります。

#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 配列をループするもっと洗練された方法があるに違いありません。

4

2 に答える 2

4

マジック ナンバー (この場合は 4) を使用せずに for ループを書き直すにはどうすればよいですか?

これを行う1つの方法は、反復している配列にspecialターミネータ値(通常)を追加することです。NULL

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

for(count = 0; v[count] != NULL; ++count)
    printf("%s",v[count]);
于 2013-06-20T18:14:37.323 に答える
1
char *v[] = { a, b, c, d};
int size = sizeof(v)/sizeof(*v);//4
于 2013-06-20T18:15:29.797 に答える