中止陷阱:6中带有循环c

时间:2017-02-01 01:57:15

标签: c arrays string algorithm unique

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语句和代码中断来测试代码。

1 个答案:

答案 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