无法按字母顺序(排序)字符串吗?

标签 c string sorting insertion-sort

所以我使用插入排序来对字符串进行排序。 如果字符串已经排序,它将运行。如果它们部分排序或完全颠倒。它要么运行产生不正确的结果,要么给出错误:(0xC0000005) .

ptr声明:char **ptr;内存是动态分配的。

插入排序:

 void insertionSort(char **ptr,int rows,int cols)
{
   char *key;
   int i,j;

   //first element is considered sorted 

   for( i=1;i<=rows-1;i++)
   {
      key=ptr[i];
      for( j=i-1;strcmp(key,ptr[j])<0 && j>=0;j--)
      {
         ptr[j+1]=ptr[j];
      }
      /*Program sometimes stalls at this part and gives error:`(0xC0000005)` 
      when strings are partially sorted/completely reversed*/
      ptr[j + 1] = key;
   }
}

这是非常标准的插入排序实现。适用于数字,所以我不知道为什么无法对字符串进行排序。

这也是ptr的方法的值是由用户定义的:

void read_charArray(char **ptr,int rows,int cols)
{
   for(int i=0;i<=rows-1;i++)
   {
      printf("Enter name for name #%-3d: ",i+1);
      fgets(ptr[i],cols+5,stdin);
      ptr[i]=strtok(array[i],"\n");
   }
}

最佳答案

错误出现在程序插入部分的第二个for()循环中:

插入排序:

 void insertionSort(char **ptr,int rows,int cols)
{
   char *key;
   int i,j;

   //first element is considered sorted 

   for( i=1;i<=rows-1;i++)
   {
      key=ptr[i];
      for( j=i-1;strcmp(key,ptr[j])<0 && j>=0;j--)
      {
         ptr[j+1]=ptr[j];
      }
      /*Program sometimes stalls at this part and gives error:`(0xC0000005)` 
      when strings are partially sorted/completely reversed*/
      ptr[j + 1] = key;
   }
}

j 递减到 0 以下时,程序实际上继续首先计算 strcmp(key,ptr[j]),尽管存在 j>=0 表达式(基本上短路. 请参见 https://softwareengineering.stackexchange.com/a/201899 )-->这意味着您正在尝试访问越界内存(未分配给程序),从而导致错误: (0xC0000005)

此错误:(0xC0000005) 表示“您访问了您无权使用的内存”,例如滥用指针或不够大的数组等。

要纠正这个问题,您所要做的就是将 for( j=i-1; strcmp(key,ptr[j])<0 && j>=0;j--) 中的条件表达式切换为 for( j=i-1; j>=0 && strcmp(key,ptr[j])<0;j--)

这样做的作用是,当 j 递减到 0 以下时,程序首先测试 j>=0,从而退出循环而不是导致错误。

关于无法按字母顺序(排序)字符串吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59998362/

相关文章:

c - 本地 linux 套接字接收旧数据

Windows 和 Mac OS 中的 C++ 字符串比较

c - 为什么我得不到 "Segmentation Fault"?

python - 如何按值列表对字典进行数字排序

java - java 求数组第二个和第三个最大元素

c - C89 中的结构体初始化

c - C 初学者,字符串数组

c - 数组声明方括号内的星号在C中是什么意思

python - 在 Python 中随机化字符串列表的最佳方法

ios - 使用 NSLocale zh_Hans_CN 在 iOS 上的中文数字排序顺序不正确?