for (int i = 0; i < size; i++) {
for (int j = i + 1; j < size; j++) {
if (strcmp(aircraft_array[j], aircraft_array[i])==0) {
for (int k = j; k < size; k++) {
strcpy(aircraft_array[k],aircraft_array[k+1]);
}
size--;
} else
j++;
}
}
大家好
我已从http://www.c4learn.com/c-programs/to-delete-duplicate-elements-in-array.html
复制了此代码。但是代码给出了错误中止代码6 。我不完全确定这意味着什么。
感谢任何帮助。
PS:我通过在这里输入print语句和代码中断来测试代码。
答案 0 :(得分:0)
在本声明中
strcpy(aircraft_array[k],aircraft_array[k+1]);
^^^^^
当k
等于size-1
时,尝试访问数组之外的内存。
此增量
} else
j++;
^^^^
没有意义,因为变量也在循环语句中递增
for (int j = i + 1; j < size; j++) {
^^^^
即增加两次。此外,当复制子数组时,变量j
不应递增。
找到副本时复制整个子数组效率很低。
该函数可以看起来有所不同,具体取决于它是处理二维字符数组还是指向字符串的指针数组。
如果有二维数组,该函数可以按照以下方式显示,如下面的示范程序所示
#include <stdio.h>
#include <string.h>
size_t remove_duplicates( size_t m, size_t n, char s[static const m][n] )
{
size_t i = 0;
for ( size_t j = 0; j < m; j++ )
{
size_t k = 0;
while ( k != i && strcmp( s[k], s[j] ) != 0 ) k++;
if ( k == i )
{
if ( i != j ) strcpy( s[i], s[j] );
++i;
}
}
return i;
}
int main(void)
{
char s[][2] = { "A", "B", "A", "C", "D", "A" };
size_t N = sizeof( s ) / sizeof( *s );
for ( size_t i = 0; i < N; i++ ) printf( "%s ", s[i] );
printf( "\n" );
size_t n = remove_duplicates( N, 2, s );
for ( size_t i = 0; i < n; i++ ) printf( "%s ", s[i] );
printf( "\n" );
return 0;
}
它的输出是
A B A C D A
A B C D
如果有一个指针数组,那么该函数可以按以下方式查找。
#include <stdio.h>
#include <string.h>
size_t remove_duplicates( char * s[], size_t n )
{
size_t i = 0;
for ( size_t j = 0; j < n; j++ )
{
size_t k = 0;
while ( k != i && strcmp( s[k], s[j] ) != 0 ) k++;
if ( k == i )
{
if ( i != j ) s[i] = s[j];
++i;
}
}
return i;
}
int main(void)
{
char * s[] = { "A", "B", "A", "C", "D", "A" };
size_t N = sizeof( s ) / sizeof( *s );
for ( size_t i = 0; i < N; i++ ) printf( "%s ", s[i] );
printf( "\n" );
size_t n = remove_duplicates( s, N );
for ( size_t i = 0; i < n; i++ ) printf( "%s ", s[i] );
printf( "\n" );
return 0;
}
其输出与上面显示的相同
A B A C D A
A B C D