删除重复的字符串

时间:2014-08-09 22:36:08

标签: c

我需要帮助删除重复的字符串。我的代码几乎就在那里,它输出唯一的字符串然后崩溃,自己看看。我怎样才能阻止这种情况发生?

#include <stdio.h>
#include <string.h>

int main(void) 
{
    char array[4][4]={"cat","mat","sat","mat"};
    int i, j, k;
    int a=4;

   for (i = 0;i < a; i++) 
   {
      for (j = i + 1; j < 4;) 
      {
         if (strcmp(array[j],array[i])==0)
         {
            for (k = j; k < a; k++) 
            {
               strcpy(array[k],array[k+1]);
            }

            a--;
         } 

         else
         j++;
      }
   }

   for (i = 0; i < a; i++) 
   {
      printf("%s", array[i]);
   }

   return (0);
}

3 个答案:

答案 0 :(得分:2)

如果您使用调试器逐步执行程序,则会发现以下是您的问题:

strcpy(array[k],array[k+1]);

当您k == 3尝试访问array范围之外的元素时strcpy的第二个参数:

array[k+1]

答案 1 :(得分:1)

你的方法并不好。找到匹配的字符串时,将数组的所有尾部复制到新位置。

这是一种更简单明了的方法

#include <stdio.h>
#include <string.h>

#define N   4

int main(void) 
{
    char s[N][N] = { "cat", "mat", "sat", "mat" };
    int i, j;

    j = 0; /* current osition where a unique string will be placed */
    for ( i = 0; i < N; i++ ) 
    {
        int k = 0;
        while ( k < j && strcmp( s[k], s[i] ) != 0 ) k++;

        if ( k == j )
        {
            if ( j != i ) strcpy( s[j], s[i] );
            j++;
        }
    }


    for ( i = 0; i < j; i++ ) printf( "%s ", s[i] );
    puts( "" );

    return 0;
}

输出

cat mat sat 

只需复制粘贴并进行调查。:)

答案 2 :(得分:0)

最好使用strcmp的strncmp。 您不必遍历字符串的每个字符,因为strncmp比较字符串tills它们的结尾(空终止字符串)。来自strncmp的文档(unix系统上的man strncmp):

  

strncmp()函数比较不超过n个字符。因为strncmp()用于比较字符串而不是二进制数据,所以不会比较出现在'\ 0'字符后面的字符。

试试这段代码:

char array[4][4]={"cat","mat","sat","mat"};
int i, j;
int a = 4;

 for (int i = 0; i < a; i++) {

    bool unique = true;
    for (int j = i + 1; j < a; j++) {
       if (strncmp(array[i], array[j], a) == 0) {
          unique = false;
          break;
       }
    }

    if (unique) {
      printf("%s\n", array[i]);
    }
 }