Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 删除重复字符串_C - Fatal编程技术网

C 删除重复字符串

C 删除重复字符串,c,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++) {

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

#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);
}
#包括
#包括
内部主(空)
{
字符数组[4][4]={“cat”、“mat”、“sat”、“mat”};
int i,j,k;
INTA=4;
对于(i=0;i
如果使用调试器逐步调试程序,您会发现以下问题:

strcpy(array[k],array[k+1]);
k==3
您试图访问
array
范围之外的元素,以获取
strcpy
的第二个参数:

array[k+1]

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

strcpy(array[k],array[k+1]);
k==3
您试图访问
array
范围之外的元素,以获取
strcpy
的第二个参数:

array[k+1]

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

strcpy(array[k],array[k+1]);
k==3
您试图访问
array
范围之外的元素,以获取
strcpy
的第二个参数:

array[k+1]

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

strcpy(array[k],array[k+1]);
k==3
您试图访问
array
范围之外的元素,以获取
strcpy
的第二个参数:

array[k+1]

最好使用strncmp而不是strcmp。 您不必遍历字符串的每个字符,因为
strncmp
将字符串与其结尾(以null结尾的字符串)进行比较。从
strncmp
的文档(unix系统上的man-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]);
    }
 }
char数组[4][4]={“cat”、“mat”、“sat”、“mat”};
int i,j;
INTA=4;
for(int i=0;i
最好使用strncmp而不是strcmp。 您不必遍历字符串的每个字符,因为
strncmp
将字符串与其结尾(以null结尾的字符串)进行比较。从
strncmp
的文档(unix系统上的man-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]);
    }
 }
char数组[4][4]={“cat”、“mat”、“sat”、“mat”};
int i,j;
INTA=4;
for(int i=0;i
最好使用strncmp而不是strcmp。 您不必遍历字符串的每个字符,因为
strncmp
将字符串与其结尾(以null结尾的字符串)进行比较。从
strncmp
的文档(unix系统上的man-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]);
    }
 }
char数组[4][4]={“cat”、“mat”、“sat”、“mat”};
int i,j;
INTA=4;
for(int i=0;i
最好使用strncmp而不是strcmp。 您不必遍历字符串的每个字符,因为
strncmp
将字符串与其结尾(以null结尾的字符串)进行比较。从
strncmp
的文档(unix系统上的man-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]);
    }
 }
char数组[4][4]={“cat”、“mat”、“sat”、“mat”};
int i,j;
INTA=4;
for(int i=0;i
你的方法不好。当您找到一个匹配的字符串时,您将在新位置复制数组的所有尾部

这里有一个更简单、更清晰的方法

#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;
}

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

您的方法不好。当您找到一个匹配的字符串时,您将在新位置复制数组的所有尾部

这里有一个更简单、更清晰的方法

#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;
}

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

您的方法不好。当您找到一个匹配的字符串时,您将在新位置复制数组的所有尾部

这里有一个更简单、更清晰的方法

#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;
}

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

您的方法不好。当您找到一个匹配的字符串时,您将在新位置复制数组的所有尾部

这里有一个更简单、更清晰的方法