繁体   English   中英

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

[英]Abort trap: 6 with loop in c

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复制了这段代码。 但是代码给了我错误Abort code 6 我不完全确定这意味着什么。

任何帮助表示赞赏。

PS:我通过放置打印语句来测试代码,代码在这里中断。

在这份声明中

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 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM