【问题标题】:Don't know how to define my swap function properly不知道如何正确定义我的交换函数
【发布时间】:2020-01-26 03:35:58
【问题描述】:

我可以在一定程度上理解指针,但swap() 中的多层取消引用让我感到困惑。因此,我无法正确实现它。

以下是基于插入排序的字母排序代码:

void insertionSort(char **array,int rows,int cols)
{
   for(int i=1;i<=rows-1;i++)
   {
      for(int j=i-1;strcmp(array[i],array[j])<0 && j>=0;j--)
      {
         swap(&array[i],&array[j]);
         i--; //when swapped, subscript of key also drops
      }
   }
}

void swap(char **s1,char**s2)
{
   char **temp=s1;
   strcpy(*s1,*s2);
   strcpy(*s2,*temp);
}

我知道swap() 的实现有误。我希望知道如何逐步完成思考过程以正确实现swap()(即如何更好地理解解引用的多层)

【问题讨论】:

  • 对于插入排序,左边有一个排序的子数组,右边有一个未排序的子数组。第一个元素可以被认为是排序的,因为它本身是排序的。所以我有点跳过了第一个元素。
  • 好吧,还是for(int i=1;i&lt;rows;i++)for(int i=1;i&lt;=rows-1;i++) 更容易理解。
  • 我认为这取决于偏好。我喜欢&lt;= 符号,这样在阅读代码时,我可以看到结尾下标,而无需在脑海中执行“减 1”过程。我猜这仍然只是偏好。

标签: c pointers


【解决方案1】:

您根本不想使用strcpy。您只需交换两个您有指针的char *s (char **s)。因此,实现应该与任何其他交换相同。临时值应该是char *,您应该交换char * 值,而不是复制它们后面的字符串。

void swap(char **s1,char **s2)
{
   char *temp = *s1;
   *s1 = *s2;
   *s2 = temp;
}

这与 e.g. 完全相同。用于交换ints 的函数,除了将int 替换为char *

【讨论】:

  • 这对我来说肯定更容易理解。但出于好奇,我想知道我的定义出了什么问题?
  • @Leon char **tmp = s1 创建一个指向char * 的新指针,它指向s1 所做的相同字符串(它不会复制字符串内容)。第一个strcpy*s2 的内容复制到*s1,因此两个字符串都有s2 的内容。第二个strcpy*temp 的内容(与*s1 相同,因此包含*s2 的原始内容)复制到*s2。如果您分配了一个新的临时 char * 并完成了 三个 strcpys,它会起作用(尽管效率低下),但是您所写的是混合了不同“深度”的复制,这就是它的原因失败。
  • *temp没有*s1的原始内容-所以你说的是什么意思,因此包含*s2的原始内容?如果我说的是正确的(不是,但我不明白为什么),两个strcpys 应该足够了吧?
  • 另外,为什么它们复制 s1,s2,temp 的“深度”不同是指向`char*`的指针。我所做的只是取消引用它们
猜你喜欢
  • 2011-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-21
  • 1970-01-01
  • 2012-09-25
相关资源
最近更新 更多