Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.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_Arrays_Sorting - Fatal编程技术网

C 删除一组行中的任何重复值

C 删除一组行中的任何重复值,c,arrays,sorting,C,Arrays,Sorting,我有一个由许多行组成的文件,其中每行由两个值组成,如: 53539 14390 14390 49489 52882 49489 23623 14390 23623 7554 23678 14390 . . . 我编写了一个c代码来读取这些行,并将它们存储在两个表T1和T2中,其中: T1[0][1]= 53539 & T2[0][1]= 14390 T1[1][1]= 14390 &

我有一个由许多行组成的文件,其中每行由两个值组成,如:

    53539 14390
    14390 49489
    52882 49489
    23623 14390
    23623 7554
    23678 14390
        .
        .
        .
我编写了一个c代码来读取这些行,并将它们存储在两个表T1和T2中,其中:

T1[0][1]= 53539 & T2[0][1]= 14390
T1[1][1]= 14390 & T2[1][1]= 49489
T1[2][1]= 52882 & T2[2][1]= 49489
   .
   .
   .
一切都很好…我知道我可以在一个表中存储这两个值,但我认为对于我的程序来说,最好定义两个不同的表,特别是为了以下目的

我尝试做的第二件事是搜索所有的值,并且只指定和计算两个表中未重复的值的数量。我的意思是两个列中的唯一值,这两个列中的值只出现一次,就像我的示例中所示:未重复的值是:53539、52882、7554和23678,所以数字是4

问题是我的代码的第二部分工作得不好,它给了我错误的值,我试图解决它,但它仍然不工作

我知道我的问题对所有程序员来说都很简单,但事实上我是c和编码的初学者

您可以在下面看到我的代码尝试:

#include <stdio.h>
#include <stdlib.h>


#define nOfLines 6


int main()
    {


FILE *file;
int i, j, ii, jj;
int T1[nOfLines][1], T2[nOfLines][1];
file=fopen("ngc.txt","r");



for(i=0; i < nOfLines ; i++) {
    fscanf(file,"%d %d", &T1[i][1], &T2[i][1]);
    printf("%d %d\n ",  T1[i][1], T2[i][1]);
   }



  int z=0;
  for(i=0; i < nOfLines ; i++) {
  for(j=0; j < nOfLines ; j++) {

  if ((T1[i][1] == T1[j][1]) || (T1[i][1] == T2[i][1]) || (T2[i][1] == T2[j][1]))
   {
  break;
  }

  printf("%d %d\n", T1[i][0], z);
  z++;
  printf("%d %d\n", T2[i][1], z);
  z++;
  }
  }
  fclose(file);
  return 0;
  }
但是它不起作用


任何形式的帮助都将不胜感激,提前感谢

将每个值存储在选项卡中,就像您所做的那样。然后您可以遍历该选项卡,并将每个值与其他值进行比较。假设您的选项卡设置了这些值,下面是一个您可以执行的示例:

void deleteRepeatedValues(int* tab)
{
    int size = strlen(tab);
    for (int i = 0; i != size; i++) // For each value of the tab
    {
        if (tab[i] != 0) // If the value hasn't already be set to 0
        {
           for (int j = i; j != size; j++)
           {
                if (tab[i] == tab[j]) // We verify that the value after aren't the same
                    tab[j] = 0; // If they are, we set them to 0
           }
        }
    }
}
然后,您可以编写一个函数,用这个函数生成一个新数组,而不需要数组的零值部分。诸如此类:

deleteRepeatedValues(tab);
int size = sizeof(tab);
int correctedTab[size];
int i = 0;
int y = 0;
while(i != size)
{
    if (tab[i] != 0) // If the value is not repeated
    {
        correctedTab[y] = tab[i]; // We copy it
        y++; // And advance in the corrected tab
    } // Otherwise we don't
    i++; // And only go further in `tab`
}
到目前为止,我还不能测试这段代码,而且我还没有尝试使它适应您已经完成的工作。这是做你想做的事情的一个暗示


此外,我建议您测试打开和关闭文件是否成功。这样可以避免很多问题

int T1[nOfLines][1]在其第二维中只有一个元素,它只能由0索引,而不能像您现在这样由1索引。T2和66也一样抱歉这是我的fault@WeatherVane感谢提供信息,但它可以正确读取数据!!你很不幸,它没有失败,所以你仍然认为它是对的。所以它应该是T1[nOfLines][0]&T2[nOfLines][0],而不是…sizeoftab;在第一个函数中是完全错误的。这是指针的大小,以字节为单位。@Badda谢谢你的帮助。你的问题解决了吗?但是你的代码正在比较一个数组中的值,在我的例子中有两个!!
deleteRepeatedValues(tab);
int size = sizeof(tab);
int correctedTab[size];
int i = 0;
int y = 0;
while(i != size)
{
    if (tab[i] != 0) // If the value is not repeated
    {
        correctedTab[y] = tab[i]; // We copy it
        y++; // And advance in the corrected tab
    } // Otherwise we don't
    i++; // And only go further in `tab`
}