所以我使用插入排序来对字符串进行排序。
如果字符串已经排序,它将运行。如果它们部分排序或完全颠倒。它要么运行产生不正确的结果,要么给出错误:(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/