问问字符串的排序(选择排序法)最后交换的时候为什么不能用strcpy,而必须交换指针的指向呢

img


上图用strcpy交换,运行不出来;

img


上图将t设为指针,交换了ps【i】与ps【min】的指向(或者说交换两者在指针数组中的位置),结果成功了??帮帮我

因为:char* ps[6] = { "FORTRAN","PASCAL","BASIC","COBOL","C","C++" }; 定义的是指针数组,数组元素是指向某一个字符串常量的指针,所以第一图里 strcpy(ps[min], ps[i]); strcpy(ps[i], t);对两个字符串常量改变他们的值是不允许的,非法的。第二图里,改变指针的指向是合法的。

可以把代码先贴出来吗

你别耍花活,老老实实用花括号+分号写,应该是可以的。

debug单步调试一下,看看具体代码执行效果

应该不能用 ps里面初使的相当于6个常量字符串 在分配的空间是固定的。可以用6个变量赋值的方式试一试

交换它们的指针而不是使用 strcpy 函数来交换字符串的内容。这是因为 strcpy 函数是用于将一个字符串的内容复制到另一个字符串中,而不是用于交换字符串本身。

该回答引用于chatGPT3.5,仅供参

在选择排序算法中,当我们交换字符串数组中的两个元素时,使用指针的指向进行交换是更有效和高效的做法,而不是使用`strcpy`函数。

`strcpy`函数用于将一个字符串复制到另一个字符串,它需要遍历整个源字符串并逐个复制字符。因此,如果我们想要交换两个字符串数组中的元素,使用`strcpy`会涉及到内存中大量的数据复制操作,这会导致性能下降。

相比之下,交换指针的指向只需要修改指针变量的值,而不需要对字符串的内容进行复制。这样可以节省时间和内存开销,尤其是在处理大型字符串或大量字符串时。

以下是使用指针进行字符串交换的示例代码:

```c
void swapStrings(char** str1, char** str2) {
    char* temp = *str1;
    *str1 = *str2;
    *str2 = temp;
}

在这个示例中,我们通过传递指向指针的指针,即char**类型,来实现字符串指针的交换。通过修改指针变量的值,我们可以直接交换两个字符串的指针,而不需要对字符串的内容进行复制。

综上所述,选择使用指针的指向进行字符串交换可以提高程序的效率,并减少不必要的复制操作。这在排序算法等涉及大量字符串操作的情况下尤为重要。

```

参考gpt:
结合自己分析给你如下建议:
字符串的排序(选择排序法)是一种简单直观的排序算法,它的基本思想是每次从未排序的字符串中选择最小(或最大)的字符串,放到已排序的字符串序列的末尾,直到所有字符串都排好序为止。
为什么最后交换的时候不能用strcpy,而必须交换指针的指向呢?这是因为strcpy是一个复制字符串的函数,它会将源字符串的内容复制到目标字符串中,覆盖原来的内容。如果用strcpy来交换两个字符串,那么就会丢失其中一个字符串的内容,导致排序结果错误。
而交换指针的指向则不会改变字符串的内容,只是改变了它们在内存中的位置。这样就可以保证排序结果正确,并且节省了复制字符串所需的时间和空间。
您可以参考以下代码示例,它用C语言实现了字符串的选择排序,并且用指针交换来完成最后的交换操作。


#include <stdio.h>
#include <string.h>

// 交换两个字符串指针
void swap(char **a, char **b) {
  char *temp = *a;
  *a = *b;
  *b = temp;
}

// 字符串选择排序
void selection_sort(char *arr[], int len) {
  int i, j, min;
  for (i = 0; i < len - 1; i++) {
    min = i;
    for (j = i + 1; j < len; j++) {
      // 比较字符串大小
      if (strcmp(arr[min], arr[j]) > 0) {
        min = j;
      }
    }
    // 交换指针
    swap(&arr[i], &arr[min]);
  }
}

// 打印字符串数组
void print_array(char *arr[], int len) {
  int i;
  for (i = 0; i < len; i++) {
    printf("%s ", arr[i]);
  }
  printf("\n");
}

int main() {
  char *arr[] = {"hello", "world", "apple", "banana", "orange", "pear"};
  int len = sizeof(arr) / sizeof(arr[0]);
  printf("Before sorting:\n");
  print_array(arr, len);
  selection_sort(arr, len);
  printf("After sorting:\n");
  print_array(arr, len);
  return 0;
}

【以下回答由 GPT 生成】

答案:

在进行字符串选择排序时,我们需要交换字符串的位置。使用strcpy函数进行字符串的交换是不可行的,原因是strcpy函数是用来将一个字符串复制到另一个字符串中,而不是进行字符串的位置交换。当我们使用strcpy函数交换字符串位置时,实际上是将源字符串的内容复制到目标字符串中,这样会导致源字符串内容被覆盖,无法正确地完成字符串位置的交换。

相反地,当我们交换指针的指向(交换指针数组中的位置),我们只是简单地交换了指针变量的值,而不是交换了字符串的内容。因为指针变量保存的是字符串的内存地址,通过交换指针的指向,实际上是交换了字符串的位置。这样就能够正确地完成字符串位置的交换。

下面是一个示例代码,展示了使用指针交换的方法来进行字符串选择排序的过程:

#include <stdio.h>
#include <string.h>

void swapStrings(char** str1, char** str2) {
    char* temp = *str1;
    *str1 = *str2;
    *str2 = temp;
}

void selectionSortStrings(char* arr[], int n) {
    int i, j;
    int minIndex;

    for (i = 0; i < n-1; i++) {
        minIndex = i;
        for (j = i+1; j < n; j++) {
            if (strcmp(arr[j], arr[minIndex]) < 0) {
                minIndex = j;
            }
        }
        if (minIndex != i) {
            swapStrings(&arr[i], &arr[minIndex]);
        }
    }
}

int main() {
    char* arr[] = {"banana", "apple", "orange", "grape"};
    int n = sizeof(arr)/sizeof(arr[0]);
    int i;

    printf("Before sorting:\n");
    for (i = 0; i < n; i++) {
        printf("%s ", arr[i]);
    }

    selectionSortStrings(arr, n);

    printf("\nAfter sorting:\n");
    for (i = 0; i < n; i++) {
        printf("%s ", arr[i]);
    }

    return 0;
}

在上面的代码中,我们使用了swapStrings函数来交换字符串指针的值,而不是使用strcpy函数来进行字符串的复制。这样就能够正确地完成字符串选择排序,并输出排序后的结果。

希望以上解答对您有所帮助。如果您还有任何问题,请随时提问。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^