Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 多维数组上的气泡排序_C_Arrays - Fatal编程技术网

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]
@CoolGuy
256
在多次掷骰子后被选为最佳选择:D两个骰子的大小都是任意的,考虑到我们要处理的是名字,10个可能太接近了。“正确的大小”只能由OP根据OP处理的输入数据来决定。很抱歉回答得太晚。谢谢你,新年快乐。@Michi也祝你新年快乐:)我建议使用
charTMP[10]
而不是
字符tmp[256]
@CoolGuy
256
在多次掷骰子后被选为最佳选择: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]);