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`
}