私がする必要があるのは、次のようなテキストまたは文字列が与えられたときです
\0abc\n\0Def\n\0Heel\n\0Jijer\n\tlkjer
qsort を使用して、rot エンコーディングの比較に基づいて、この文字列をソートする必要があります。
int my_rot_conv(int c) {
if ('a' <= tolower(c) && tolower(c) <= 'z')
return tolower(c)+13 <= 'z' ? c+13 : c-13;
return c;
}
int my_rot_comparison(const void *a, const void *b) {
char* ia = (char*) a;
char* ib = (char*) b;
int i=0;
ia++, ib++;
while (i<strlen(ia)) {
if (ia[i] == '\0' || ia[i] == '\n' || ia[i] == '\t' || ib[i] == '\0' || ib[i] == '\n' || ib[i] == '\t') {
i++;
}
if (my_rot_conv(ia[i]) > my_rot_conv(ib[i])) {
return 1;
} else if (my_rot_conv(ia[i]) < my_rot_conv(ib[i]))
return -1;
}
return 0;
}
次の例では、\0 で始まる 2 つの文字列を比較して -1 を取得しています。
printf("%d \n", my_rot_comparison("\0Abbsdf\n", "\0Csdf\n"));
ただし、これは qsort を使用した文字列では機能しません。これはia++, ib++;
、1 つの単語の比較でしか機能しないためです。
char *my_arr;
my_arr = malloc(sizeof(\0abc\n\0Def\n\0Heel\n\0Jijer\n\tlkjer));
strcpy(my_arr, \0abc\n\0Def\n\0Heel\n\0Jijer\n\tlkjer);
qsort(my_arr, sizeof(my_arr), sizeof(char), my_rot_comparison);
配列は次のようにソートする必要があります\0Def\n\0Heel\n\0Jijer\n\0\n\tlkjer
私の質問は、文字\0
と文字を含む文字列に対して機能する比較関数をどのように定義すればよいですか?\t
\n