の代わりに添字表記を使用して関数を書き直すと、問題が見やすくなる場合があります*(pt+i)
。
void sort_strlen(char (*pt)[81]){
char (*temp)[81];
int i, j;
for(i = 0; i < 10 && pt[i] != NULL; i++)
for(j = i + 1; j < 10 && pt[j] != NULL; j++)
if(strlen(pt[i]) < strlen(pt[j])){
temp = pt[i];
pt[i] = pt[j];
pt[j] = temp;
}
for(i = 0; i < 10 && pt[i] != NULL; i++)
puts(pt[i]);
}
pt[i]
したがって、とを交換しようとするときは、最初に(ここで が自動的に変換される) を行の aにpt[j]
割り当てようとします。char*
char[81]
pt[i]
char(*)[81]
temp = pt[i];
型の非互換性は、ここで明確にする必要があります。pt[i]
しかし、通常、それは単なる警告であり、配列のアドレスでもあるその文字列の最初のバイトのアドレスに変換されるため、「意図したとおりに機能します」pt[i]
。&pt[i]
またはを割り当てて右辺の型を調整すると、警告は消えますpt + i
。
エラーは次の行にあります。pt[i] = pt[j];
行では、 achar*
を aに割り当てようchar[81]
とし、行pt[j] = temp;
では achar(*)[81]
を aに割り当てようとしますchar[81]
。
配列は代入できないため、書き込み
pt[i] = ...
常にエラーです。残念なことに、gcc は次のように報告しています。
sort_strlen.c:13:18: error: incompatible types when assigning to type ‘char[81]’ from type ‘char *’
sort_strlen.c:14:18: error: incompatible types when assigning to type ‘char[81]’ from type ‘char (*)[81]’
根本原因をすぐに指摘するのではなく、
sort_strlen.c:13:18: error: array type 'char [81]' is not assignable
*(pt + i) = *(pt + j);
~~~~~~~~~ ^
sort_strlen.c:14:18: error: array type 'char [81]' is not assignable
*(pt + j) = temp;
~~~~~~~~~ ^
そのclangが発します。gcc が報告する「互換性のない型」は、割り当ての左側の配列型と互換性のある右側の型がないため、基本的に修正できません。
ポインターの配列を作成することで問題を解決しました。配列内のアドレスを変更して、文字列を直接ソートしたかったのです。可能かどうかは誰にもわかりませんか?それを行う最良の方法は何ですか?
それはあなたが何をしたいかによります。文字列自体を移動せずに文字列のアドレスを変更することはできません。たとえば、次のようにします。
char temp[81];
...
strcpy(temp, pt[i]);
strcpy(pt[i], pt[j]);
strcpy(pt[j], temp);
文字列を移動したくない場合は、ポインターの配列を作成するのが最善です
char *strings[10];
for(int i = 0; i < 10; ++i) {
strings[i] = pt[i]; // make it &pt[i][0] if you don't like the implicit conversion
}
strings
配列を文字列の長さで並べ替えます。
char *temp;
...
if (strlen(strings[i]) < strlen(strings[j])) {
temp = strings[i];
strings[i] = strings[j];
strings[j] = temp;
}