大佬教程收集整理的这篇文章主要介绍了标准输入+字典文本替换工具——调试,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
ipsum i%#@!
fubar fubar
IpSum XXXXX24
Ipsum YYYYY211
@H_197_2@然后程序从 stdin 读入输入,如果有任何“单词”与字典文件中的键匹配,它们将被替换为值。大小写有点小——这是“匹配优先级”的顺序
vimdiff
并变得更加困惑。我希望得到一些帮助来调试这个,拜托!我一整天都在做这件事,我很困惑。
$ ./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);
}
while((ch = getchar()) ...)
:输入中的 NUL 会导致循环结束。您必须推迟对 EOF 的测试,因为您的缓冲区中仍有可能是最后一个词 ...&& ch != EOF)
processInput()
函数中存在多个问题:
while ((ch = getchar()) != EOF)
EOF
的测试实际上应该以不同的方式进行,这样文件的最后一个单词如果恰好出现在文件末尾,就有机会得到处理。
isalnum((char)ch)
中的转换不正确:您应该将 ch
直接传递给 isalnum
。强制转换为 char
实际上适得其反,因为它会将超出 CHAR_MAX
的字节值转换为 isalnum()
具有未定义行为的负值。
if(ind >= cap)
太松散:如果 word
包含 cap
个字符,则在 word[ind]
处设置空终止符将写入超出数组末尾。将测试更改为 if (cap - ind < 2)
以始终允许一个字节和一个空终止符。
checkData()
。
char keY[ind + 1];
没用:你可以把 word
传给 checkData()
。
checkData(key,ind)
不正确:您应该传递大小写转换的缓冲区大小,该大小至少为 ind + 1
以允许空终止符。
putchar((char)ch);
中的演员表既无用又令人困惑。
以上是大佬教程为你收集整理的标准输入+字典文本替换工具——调试全部内容,希望文章能够帮你解决标准输入+字典文本替换工具——调试所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。