如何在c中按字母顺序对字符串数组进行排序?
这是我的尝试:
/**
* sort data alphabetically
* @param data[] array of strings
* @param size array size
* @return an alphabetically sorted array
*/
char *sortAlphabetically(char *data[], int size)
{
char *sortedArray = malloc(size);
char *temp;
int index, nextIndex;
// copy data to avoid mutation
for (int i = 0; i < size; i++)
snprintf(&sortedArray[i], size, "%s", data[i]);
// check data is not empty data
if (!sortedArray)
return NULL;
for (index = 0; index < size; index++)
{
for (nextIndex = index + 1; nextIndex < size; nextIndex++)
{
// return positive integer if string1 is greater than string2, negative if lesser and 0 if equal. strmp compares both string chars by ASCII values
if (strcmp(sortedArray[index], sortedArray[nextIndex]) > 0)
{
temp = sortedArray[index];
sortedArray[index] = sortedArray[nextIndex];
sortedArray[nextIndex] = temp;
}
}
}
return sortedArray;
}
int main()
{
int size = 4;
char *names[size];
char *result;
for (int i = 0; i < size; i++)
{
printf("(%d) Enter a name: ", i);
scanf("%s", names[i]);
}
result = sortAlphabetically(names, size);
if (result)
{
for (int i = 0; i < size; i++)
printf("%s", result[i]);
free(result);
return 0;
}
}
但是,我复制data
到sortedArray
using的方式似乎出现了问题snprintf
。
我打算从sort函数返回一个新数组。
我到底在哪里弄错了,防止突变的最佳方法是什么?
sortedArray
应该定义为,char **
并分配为:
char **sortedArray = malloc(size * sizeof(*sortedArray));
还有其他问题:
strdup()
分配字符串的副本。scanf("%s",...)
这是一个安全漏洞:输入时间过长将导致scanf()
写入操作超出目标数组的末尾。传递最大字节数以存储为%
和之间的数字s
。这是修改后的版本:
/**
* clone an array of strings
* @param array (source)
* @param array_size (source)
* @return array
*/
char **cloneArray(char *source[], int size) {
char **destination = NULL;
if (source) {
destination = malloc(size * sizeof(*destination));
if (destination) {
for (int i = 0; i < size; i++) {
destination[i] = strdup(source[i]);
}
}
}
return destination;
}
/**
* free an array of strings
* @param array
* @param array_size
* @return void
*/
void freeArray(char *array[], int size) {
if (array) {
for (int i = 0; i < size; i++) {
free(array[i]);
}
free(array);
}
}
/**
* sort data lexicographically into a new array with duplicate strings
* @param array array of strings
* @param array_size array size
* @return a lexicographically sorted array
*/
char **sortAlphabetically(char *data[], int size) {
char **sortedArray = cloneArray(data, size);
// check for allocation failure
if (!sortedArray)
return NULL;
for (int index = 0; index < size; index++) {
for (int nextIndex = index + 1; nextIndex < size; nextIndex++) {
// return positive integer if string1 is greater than string2,
// negative if lesser and
// 0 if equal.
// strcmp compares both string chars by unsigned char values
if (strcmp(sortedArray[index], sortedArray[nextIndex]) > 0) {
char *temp = sortedArray[index];
sortedArray[index] = sortedArray[nextIndex];
sortedArray[nextIndex] = temp;
}
}
}
return sortedArray;
}
int main() {
int size = 4;
char **names = malloc(size * sizeof(*names));
if (names == NULL)
return 1;
for (int i = 0; i < size; i++) {
char buf[100];
printf("\n(%d) Enter a name: ", i);
if (scanf("%99s", buf) != 1)
return 1;
names[i] = strdup(buf);
if (names[i] == NULL)
return 1;
}
char **result = sortAlphabetically(names, size);
if (result) {
for (int i = 0; i < size; i++)
printf("%s\n", result[i]);
freeArray(result, size);
}
freeArray(names, size);
return 0;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句