我正在尝试为C中的二维数组做一个选择排序算法(如标题所示),代码编译但不幸的是它没有对任何内容进行排序。
有什么我可以改变它会使它工作吗?还是我必须一起重新开始?
void sortStrings(char strings[5][32])
{
int i, j, min;
for (i = 0; i < sizeof(strings); i++){
min = i;
for (j = 0; j < sizeof(strings-1); j++){
if (strings[i] < strings[min]){
min = 1;
}
}
if (min != i){
swapStrings(strings[i], strings[min]);
}
}
}
此处还有我的swapStrings函数供参考:
void swapStrings(char string1[], char string2[])
{
char *temp = string1;
string1 = string2;
string2 = temp;
}
答案 0 :(得分:0)
sizeof
返回参数在内存中获取的大小。
在您的情况下,char的大小不是数组的大小。
您可以使用strlen函数获取字符串的大小。
但是,您无法获得数组strings
的大小,您需要在函数中添加参数。
答案 1 :(得分:0)
我在你的代码中看到了一些错误:
for (i = 0; i < sizeof(strings); i++){
你为什么使用sizeof? sizeof不是为了那个。
你想在这做什么:
if (strings[i] < strings[min]){
这似乎是一个错误。
你在这里要做什么?:
swapStrings(strings[i], strings[min])
您的函数swapStrings
是错误的,因为不返回任何内容并且不会更改任何内容。
最后,你能解释一下你想做什么吗?
答案 2 :(得分:0)
看起来不对,因为在干运行期间我发现它在第一次运行时向result
函数发送了swap
。
看起来您设置了i=Min=j=0
,然后只检查了!=
;
加上其他人的写作。
答案 3 :(得分:0)
void swapStrings(char string1[], char string2[])
{
char *temp = string1; //it means nothing in string
string1 = string2; //you must use strcpy(string1,string2)
string2 = temp;
}
答案 4 :(得分:0)
如果没有传递排序逻辑的有效性,您在C语言中的字符串处理中缺少一些基础知识。您的交换函数是:
void swapStrings(char string1[], char string2[])
{
char *temp = string1;
string1 = string2;
string2 = temp;
}
这种逻辑不适用于口碑。它是字符交换逻辑。为什么呢?
您必须使用数组索引或指针复制字符串,并使用其中一个字符串库复制函数(例如strcpy
,{{1 }},strncpy
,sprintf
,snprintf
等。 (注意:memcpy
系列位于printf
)
接下来,要在stdio.h
中使用temp
,您必须知道swapStrings
和string1
的最大长度。为什么?您必须为string2
提供足够的存储空间才能保留temp
和string1
中最长的存储空间。怎么样?计算string2
内的最大长度或将最大长度作为参数传递给swapStrings
。
接下来,正确的是,当您将数组作为swapStrings
传递给swapStrings
时,您将屏蔽字符数组到指针的转换,每次数组都会发生作为参数传递给函数。因此,您为char string1[]
传递的参数只需string1
。 (转换仅限于第一级间接,例如,如果你有一个二维数组,说char *string1
它将被转换为一个指向数组char strarray[20][64]
的指针 - 输入char *strarray[64]
)
传递char (*)[64]
和string1
的最大长度,您可以使用以下内容来交换字符串:
string2
这要求#include <stdlib.h>
#include <string.h>
...
void swapStrings (char *string1, char *string2, size_t maxlen12)
{
char *temp = malloc (maxlen12 + 1); /* you must allocate space for temp */
/* including space for nul-byte */
if (!temp) { /* validate ALL memory allocations */
fpritnf (stderr, "error: virtual memory exhausted.\n");
return;
}
/* you CANNOT ASSIGN strings, you must copy them */
strncpy (temp, string1, maxlen12 + 1);
strncpy (string1, string2, maxlen12 + 1);
strncpy (string2, temp, maxlen12 + 1);
free (temp); /* if you allocate it, you are responsible for freeing it */
}
和string1
都是有效的 nul-terminated 字符串。
注意:您也可以使用VLA(可变长度数组)而不是使用string2
进行分配,但这只与C99 +或C89编译器有关添加了明确的VLA扩展名。
另请注意:如果您将指针的地址作为参数传递,则可以指定和交换指针,但这是另一天。
最后注意:如果malloc
和string1
差异很大(10,000或100,000的字符),您会想要使用不同的字符复制函数string2
会将strncpy
写入每个字符串中以 nul-byte 开头的所有字符。在长度不同的非常长的字符串中,这可能会有些低效。
答案 5 :(得分:0)
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
void printArray(char *array[], int size)
{
int i;
for (i=0; i<size; i++)
{
printf("%s ", array[i]);
}
printf("\n");
}
/* Selection Sort in Descending Order */
void sortSelectionFromSmallest(char *array[], int size)
{
int unsortedStart; /* the start index of unsorted part */
int i,j;
int largestIndex;
char *temp;
for (unsortedStart = 0; unsortedStart < size - 1; unsortedStart++)
{
/* search for the largest number in unsorted part */
largestIndex = unsortedStart;
for (i=unsortedStart + 1; i <= size-1; i++)
{
//if (strcmp(array[largestIndex], array[i]) < 0)
if (strlen(array[largestIndex]) < strlen(array[i]))
{
largestIndex = i;
}
}
/* swap with start of unsorted */
temp = array[unsortedStart];
array[unsortedStart] = array[largestIndex];
array[largestIndex] = temp;
/* print the array at intermediate steps */
printArray(array, size);
}
}
int main()
{
char* array[8] = {"London", "Edo", "Paris", "Taipei", "Beijing", "Singapore", "Berlin", "Shanghai"};
printf("Original array\n");
printArray(array, 8);
printf("\nSorting array\n");
sortSelectionFromSmallest(array, 8);
printf("\nSorted array\n");
printArray(array, 8);
return 0;
}