C 多维数组上的气泡排序
今天我尝试对多维数组进行排序,但我不明白为什么它不起作用 该算法交换第一个字母,但不交换整个字符串。这是一个工作,它显示了算法按字母顺序打印找到的每个字符串的首字母 用于交换整个字符串(不仅仅是第一个字母)的相同算法不起作用:C 多维数组上的气泡排序,c,arrays,C,Arrays,今天我尝试对多维数组进行排序,但我不明白为什么它不起作用 该算法交换第一个字母,但不交换整个字符串。这是一个工作,它显示了算法按字母顺序打印找到的每个字符串的首字母 用于交换整个字符串(不仅仅是第一个字母)的相同算法不起作用: #include <stdio.h> #include <string.h> int main(void){ char arr[][10] = {"Michael" , "Tanja" ,"Adda", "Jenny", "Kimberl
#include <stdio.h>
#include <string.h>
int main(void){
char arr[][10] = {"Michael" , "Tanja" ,"Adda", "Jenny", "Kimberly", "Walter" , "Donna"};
size_t length = sizeof arr / sizeof *(arr + 0);
unsigned int i,j, k=0;
char *tmp;
for (i = 0 ; i < length-1; i++){
for (k = 0 ; k < length-i-1; k++){
if (arr[k][0] > arr[k+1][0]){
tmp = arr[k];
strcpy(arr[k], arr[k+1]);
strcpy(arr[k+1], tmp);
}
}
}
printf("Sorted Array:\n");
for ( j = 0 ; j < length ; j++ ){
printf("%s ", arr[j]);
}
printf("\n\n");
return 0;
}
它应该是:
Adda Donna Jenny Kimberly Michael Tanja Walter
tmp
只是一个指针。因此在赋值过程中tmp=arr[k]
和后续的strcpy()
,由于arr[k]
被arr[k+1]
覆盖而丢失。但在交换过程中需要复制字符串。因此,请使用缓冲区:
char tmp[256];
及
tmp
只是一个指针。因此在赋值过程中tmp=arr[k]
和后续的strcpy()
,由于arr[k]
被arr[k+1]
覆盖而丢失。但在交换过程中需要复制字符串。因此,请使用缓冲区:
char tmp[256];
及
由于tmp
指向arr[k]
,在arr[k]
中复制arr[k+1]
并在后者中复制tmp
后,会得到相同的值,因为arr[k]
本身被修改(tmp
指向此修改值)
你可以这样做-
char tmp[20];
strcpy(tmp,arr[k]);
由于tmp
指向arr[k]
,在arr[k]
中复制arr[k+1]
并在后者中复制tmp
后,会得到相同的值,因为arr[k]
本身被修改(tmp
指向此修改值)
你可以这样做-
char tmp[20];
strcpy(tmp,arr[k]);
问题是
tmp=arr[k]
在tmp
中存储arr[k]
的地址。记住:内存地址是恒定的,不会改变。另外,您可以使用sizeof*arr
而不是sizeof*(arr+0)
@CoolGuy我知道,我想我只是忽略了这一部分。谢谢你,祝你新年快乐。问题是tmp=arr[k]
在tmp
中存储arr[k]
的地址。记住:内存地址是恒定的,不会改变。另外,您可以使用sizeof*arr
而不是sizeof*(arr+0)
@CoolGuy我知道,我想我只是忽略了这一部分。谢谢你,祝你新年快乐。我建议使用chartmp[10]
而不是字符tmp[256]
@CoolGuy256
在多次掷骰子后被选为最佳选择:D两个骰子的大小都是任意的,考虑到我们要处理的是名字,10个可能太接近了。“正确的大小”只能由OP根据OP处理的输入数据来决定。很抱歉回答得太晚。谢谢你,新年快乐。@Michi也祝你新年快乐:)我建议使用charTMP[10]
而不是字符tmp[256]
@CoolGuy256
在多次掷骰子后被选为最佳选择:D两个骰子的大小都是任意的,考虑到我们要处理的是名字,10个可能太接近了。“正确的大小”只能由OP根据OP处理的输入数据来决定。很抱歉回答得太晚。谢谢你,新年快乐。@Michi也祝你新年快乐:)我建议使用charTMP[10]
而不是chartmp[20]
@CoolGuy在复制到其他阵列时防止溢出?10,因为arr
每行有10个插槽:char arr[][10]
<代码> char tMP(20)浪费10字节。@ CultGook OK,但是OP应该考虑提供所需的大小。或者,你可以对他提供的工作示例感到满意,并且在你相信它需要的时候(以及如何学习优化它)进行优化:(我建议使用<代码> CHAR-TMP(10);而不是chartmp[20]
@CoolGuy在复制到其他阵列时防止溢出?10,因为arr
每行有10个插槽:char arr[][10]
<代码> char tMP(20)浪费10字节。@ CultGook OK,但是OP应该考虑提供所需的大小。或者你可以对他提供的工作示例感到满意,并且在你相信它需要的时候(以及如何学习优化它)进行优化:
char tmp[20];
strcpy(tmp,arr[k]);