如何从两个字符数组中获取行以检查每行之间的相等性
How to get lines from two char arrays to check the equality between each of their lines
我正在为一个 uni 项目编程。目前,我的消费者线程有一个函数,但现在不存在这个问题。问题是,我不想检查内容的相等性(arg->lineF1 和 arg->lineF2),而是想遍历它们的每一行(假定 arg->lineF1 和 arg->lineF2 是字符数组) 并检查它们的每一行是否相等,我尝试了一些方法,但到目前为止它们还没有起作用。
我必须指出,我发现的这些问题的解决方案不起作用(试过 strtok 失败,试过循环,但我没有得到空行)。
void * fonctionConsummer(void * args){
struct argumentThreadConsummer *arg = (struct argumentThreadConsummer *)args;
//-----------------LINE BY LINE CHECKING------------------------------------
void * fonctionConsummer(void * args){
struct argumentThreadConsummer *arg = (struct argumentThreadConsummer *)args;
//-----------------LINE BY LINE CHECKING------------------------------------
int counter = 0;
const char s[2] = "\n";
char *lineF1;
char *lineF2;
lineF1 = strtok(arg->lineF1,s);
lineF2 = strtok(arg->lineF2,s);
while(lineF1 != NULL || lineF2 != NULL){
printf("%d ", counter);
printf("Line F1 %s\n" , lineF1); // Add the new line character here since it is removed from the lineF1ization process
printf("Line F2 %s\n" , lineF2); // Add the new line character here since it is removed from the lineF1ization process
counter++;
lineF1 = strtok(NULL, s);
lineF2 = strtok(NULL, s);
}
//---------------------------------------------------------------------------
if(strcmp (arg->lineF1, arg->lineF2) == 0){
printf("\nLes fichiers ont le meme contenu\n");
pthread_exit(0);
}
printf("\nLes fichiers n'ont pas le meme contenu\n");
pthread_exit(0);
}
两个文件的内容:
输出是:
我不明白为什么我从 F2 中得到 null(在第二次迭代中)
在此先感谢您的帮助,我是 C 编程的初学者。
如果你想检查两个文件是否相同,正如我从你的陈述中了解到的,你可以使用内存映射文件,这里是对它的一些信息的引用:http://man7.org/linux/man-pages/man2/mmap.2.html。
这是做什么的,它将文件中的内容放入内存中,您可以像访问缓冲区一样访问文件的内容。
strtok
将正在解析的字符串的数据存储在一个静态位置,这意味着您一次只能对一个字符串使用它。如果您同时在两个字符串上使用它(就像您尝试做的那样),则第二次调用将破坏第一次调用的信息。您可以改用 strtok_r
,但这仍然会有一个额外的问题——空行(两个连续的换行符)将被跳过,因此如果输入不同,您的比较将(不正确?) return 匹配通过空行。您可以通过使用 strsep
来避免该问题(以及重入):
char *lineF1, *saveF1 = arg->lineF1;
char *lineF2, *saveF2 = arg->lineF2;
lineF1 = strsep(&saveF1, s);
lineF2 = strsep(&saveF2, s);
while(lineF1 != NULL || lineF2 != NULL){
:
lineF1 = strsep(&saveF1, s);
lineF2 = strsep(&saveF2, s);
}
如果您的系统没有 strsep(这是一个 BSD/GNU libc 特定函数),您可以自己定义它:
char *strsep(char **str, const char *delim) {
char *rv = *str;
if (rv) {
*str += strcspn(rv, delim);
if (**str)
*(*str)++ = '[=11=]';
else
*str = 0; }
return rv;
}
我正在为一个 uni 项目编程。目前,我的消费者线程有一个函数,但现在不存在这个问题。问题是,我不想检查内容的相等性(arg->lineF1 和 arg->lineF2),而是想遍历它们的每一行(假定 arg->lineF1 和 arg->lineF2 是字符数组) 并检查它们的每一行是否相等,我尝试了一些方法,但到目前为止它们还没有起作用。
我必须指出,我发现的这些问题的解决方案不起作用(试过 strtok 失败,试过循环,但我没有得到空行)。
void * fonctionConsummer(void * args){
struct argumentThreadConsummer *arg = (struct argumentThreadConsummer *)args;
//-----------------LINE BY LINE CHECKING------------------------------------
void * fonctionConsummer(void * args){
struct argumentThreadConsummer *arg = (struct argumentThreadConsummer *)args;
//-----------------LINE BY LINE CHECKING------------------------------------
int counter = 0;
const char s[2] = "\n";
char *lineF1;
char *lineF2;
lineF1 = strtok(arg->lineF1,s);
lineF2 = strtok(arg->lineF2,s);
while(lineF1 != NULL || lineF2 != NULL){
printf("%d ", counter);
printf("Line F1 %s\n" , lineF1); // Add the new line character here since it is removed from the lineF1ization process
printf("Line F2 %s\n" , lineF2); // Add the new line character here since it is removed from the lineF1ization process
counter++;
lineF1 = strtok(NULL, s);
lineF2 = strtok(NULL, s);
}
//---------------------------------------------------------------------------
if(strcmp (arg->lineF1, arg->lineF2) == 0){
printf("\nLes fichiers ont le meme contenu\n");
pthread_exit(0);
}
printf("\nLes fichiers n'ont pas le meme contenu\n");
pthread_exit(0);
}
两个文件的内容:
输出是:
我不明白为什么我从 F2 中得到 null(在第二次迭代中)
在此先感谢您的帮助,我是 C 编程的初学者。
如果你想检查两个文件是否相同,正如我从你的陈述中了解到的,你可以使用内存映射文件,这里是对它的一些信息的引用:http://man7.org/linux/man-pages/man2/mmap.2.html。 这是做什么的,它将文件中的内容放入内存中,您可以像访问缓冲区一样访问文件的内容。
strtok
将正在解析的字符串的数据存储在一个静态位置,这意味着您一次只能对一个字符串使用它。如果您同时在两个字符串上使用它(就像您尝试做的那样),则第二次调用将破坏第一次调用的信息。您可以改用 strtok_r
,但这仍然会有一个额外的问题——空行(两个连续的换行符)将被跳过,因此如果输入不同,您的比较将(不正确?) return 匹配通过空行。您可以通过使用 strsep
来避免该问题(以及重入):
char *lineF1, *saveF1 = arg->lineF1;
char *lineF2, *saveF2 = arg->lineF2;
lineF1 = strsep(&saveF1, s);
lineF2 = strsep(&saveF2, s);
while(lineF1 != NULL || lineF2 != NULL){
:
lineF1 = strsep(&saveF1, s);
lineF2 = strsep(&saveF2, s);
}
如果您的系统没有 strsep(这是一个 BSD/GNU libc 特定函数),您可以自己定义它:
char *strsep(char **str, const char *delim) {
char *rv = *str;
if (rv) {
*str += strcspn(rv, delim);
if (**str)
*(*str)++ = '[=11=]';
else
*str = 0; }
return rv;
}