【问题标题】:How to get lines from two char arrays to check the equality between each of their lines如何从两个 char 数组中获取行以检查每行之间的相等性
【发布时间】:2020-04-29 12:21:52
【问题描述】:

我正在为一个 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 编程的初学者。

【问题讨论】:

  • 您对strtok() 进行了哪些尝试,但没有成功?这正是您的问题的解决方案。显示该代码。
  • 该错误也可能来自您阅读文件的方式。请出示minimal reproducible example。您的代码不完整,将其减少到最小可能重现您面临的问题(例如,您可能甚至不需要线程来重现问题)。
  • 建议删除行://-----------------LINE BY LINE CHECKING------------------------------------ void * fonctionConsummer(void * args){ struct argumentThreadConsummer *arg = (struct argumentThreadConsummer *)args;
  • 关于:if(strcmp (arg->lineF1, arg->lineF2) == 0){ 由于对 strtok() 的调用将 '\n' 替换为 NUL 字节,并且strcmp() 在遇到的第一个 NUL 字节处停止,因此结果仅将比较每行的第一部分,而不是整个数组
  • 请不要张贴图片,而是复制/粘贴实际文字

标签: c char string-comparison c-strings strcmp


【解决方案1】:

strtok 将正在解析的字符串的数据存储在静态位置,这意味着您一次只能在一个字符串上使用它。如果您同时在两个字符串上使用它(就像您尝试做的那样),第二次调用将破坏第一次调用的信息。您可以改用strtok_r,但这仍然会有一个额外的问题——空行(两个连续的换行符)将被跳过,因此如果输入不同时,您的比较将(不正确?)返回匹配项。您可以改用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)++ = '\0';
        else
            *str = 0; }
    return rv;
}   

【讨论】:

    【解决方案2】:

    如果你想检查两个文件是否相同,正如我从你的陈述中理解的那样,你可以使用内存映射文件,这里是对它的一些信息的引用:http://man7.org/linux/man-pages/man2/mmap.2.html。 这是做什么的,它将文件中的内容放入内存中,并且您可以在访问缓冲区时访问文件的内容。

    【讨论】:

      猜你喜欢
      • 2020-05-24
      • 2017-01-23
      • 1970-01-01
      • 2013-08-30
      • 2018-05-13
      • 2020-05-28
      • 1970-01-01
      • 1970-01-01
      • 2023-02-01
      相关资源
      最近更新 更多