如果我们使用下标符号而不是*(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]
andpt[j]
时,首先尝试将 a char*
(在char[81]
pt[i]
此处自动转换为)分配给行char(*)[81]
中的a temp = pt[i];
。
类型不兼容在这里应该很清楚。但通常,这只是一个警告并且“按预期工作”,因为pt[i]
它被转换为该字符串中第一个字节的地址,这也是数组的地址pt[i]
。&pt[i]
如果通过分配或调整右侧的类型,警告将消失pt + i
。
错误在下一行。在该pt[i] = pt[j];
行中,您尝试将 a 分配char*
给 a char[81]
,在该pt[j] = temp;
行中,您尝试将 a 分配char(*)[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;
~~~~~~~~~ ^
那铿锵的声音。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;
}