程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了标准输入+字典文本替换工具——调试大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决标准输入+字典文本替换工具——调试?

开发过程中遇到标准输入+字典文本替换工具——调试的问题如何解决?下面主要结合日常开发的经验,给出你关于标准输入+字典文本替换工具——调试的解决方法建议,希望对你解决标准输入+字典文本替换工具——调试有所启发或帮助; @H_197_2@我正在处理一个项目,其中有两个主要文件。本质上,该程序读入一个文本文件,该文件定义了一个带有键值映射的字典。每个键都有一个唯一的值,文件的格式如下,每个键值对都在自己的行上:

ipsum i%#@!
fubar fubar
IpSum XXXXX24
Ipsum YYYYY211
@H_197_2@然后程序从 stdin 读入输入,如果有任何“单词”与字典文件中的键匹配,它们将被替换为值。大小写有点小——这是“匹配优先级”的顺序

  1. 确切的词在替换集中
  2. 除第一个字符以外的所有字符都转换为小写的单词在替换集中
  3. 完全转换为小写的单词在替换集中
@H_197_2@意思是如果确切的词在字典中,它会被替换,但如果不是,则检查下一个可能性(2),依此类推...

@H_197_2@我的程序通过了我们提供的基本情况,但随后终端显示 输出与参二进制文件不同。

@H_197_2@我进入了两个文件(不是 c 文件,而是二进制文件),一个是超长的,有大量的数字,另一个只有一行随机字符。所以这并没有真正的帮助。我还检查了我的代码并进行了一些小测试,但看起来还可以吗?一位朋友建议我确保我在 processinput() 中虑了 null 运算符,而且我已经这样做了(或者至少我是这么认为的,如果我错了,请纠正我)。我还将 getchar() 转换为 int 以正确检查 EOF,并为 char 数组分配额外的空间。我也试过 vimdiff 并变得更加困惑。我希望得到一些帮助来调试这个,拜托!我一整天都在做这件事,我很困惑。

解决方法

@H_197_2@首先使用以下方法测试您的标记器:

$ ./a.out <badhash2.c >zooi
$ diff badhash2.c zooi
$
@H_197_2@它也适用于二进制文件吗?:

$ ./a.out <./a.out > zooibin
$ diff ./a.out zooibin
$
@H_197_2@是的,确实如此!


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

void processInput(void);

int main(int argc,char **argv) {
  processInput();
  return 0;
}

void processInput() {
  int ch;
  char *word;
  int len = 0;
  int cap = 60;
  word = malloc(cap);

  while(1) {
    ch = getchar();                 // (1)
    if( ch != EOF && isalnum(ch)) { // (2)
        if(len+1 >= cap) {          // (3)
            cap += cap/2;
            word = realloc(word,cap);
        }
        word[len++] = ch;
    } else {
        if (len) {                  // (4)
#if 0
            char keY[len + 1]; 
            memcpy(key,word,len); keY[len] = 0; 
            checkData(key,len); 
#else
            word[len] = 0;
            fputs(word,stdout); 
#endif
            len = 0; 
            }
        if (ch == EOF) break;      // (5)
        putchar(ch); 
      }
    }
    free(word);

  }
                         

@H_197_2@我只修复了你的标记器,省略了哈希表和搜索和替换的东西。现在应该生成输入的逐字副本。 (这很愚蠢,但非常适合测试)

  1. @H_197_2@如果要允许二进制输入,则不能使用 while((ch = getchar()) ...) :输入中的 NUL 会导致循环结束。您必须推迟对 EOF 的测试,因为您的缓冲区中仍有可能是最后一个词 ...&& ch != EOF)

  2. @H_197_2@把 EOF 当作一个空格:它可能是一个词的结尾

  3. @H_197_2@您也必须为 NUL ('\0') 保留空间。

  4. @H_197_2@if (len==0) 就没有词了,所以不用查了。

  5. @H_197_2@我们将 EOF 视为一个空格,但我们不想将其写入输出。是时候跳出循环了。

, @H_197_2@processInput() 函数中存在多个问题:

  • @H_197_2@当读取的字节为 0 时循环不应停止,您应该使用以下命令处理完整输入:

      while ((ch = getchar()) != EOF)
    
  • @H_197_2@对 EOF 的测试实际上应该以不同的方式进行,这样文件的最后一个单词如果恰好出现在文件末尾,就有机会得到处理。

  • @H_197_2@isalnum((char)ch) 中的转换不正确:您应该将 ch 直接传递给 isalnum。强制转换为 char 实际上适得其反,因为它会将超出 CHAR_MAX 的字节值转换为 isalnum() 具有未定义行为的负值。

  • @H_197_2@测试 if(ind >= cap) 太松散:如果 word 包含 cap 个字符,则在 word[ind] 处设置空终止符将写入超出数组末尾。将测试更改为 if (cap - ind < 2) 以始终允许一个字节和一个空终止符。

  • @H_197_2@您应该检查单词中是否至少有一个字符,以避免使用空字符串调用 checkData()

  • @H_197_2@char keY[ind + 1]; 没用:你可以把 word 传给 checkData()

  • @H_197_2@checkData(key,ind) 不正确:您应该传递大小写转换的缓冲区大小,该大小至少为 ind + 1 以允许空终止符。

  • @H_197_2@putchar((char)ch); 中的演员表既无用又令人困惑。

@H_197_2@代码的其余部分存在一些小问题,但不会导致问题。

大佬总结

以上是大佬教程为你收集整理的标准输入+字典文本替换工具——调试全部内容,希望文章能够帮你解决标准输入+字典文本替换工具——调试所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: