这是我关于Stack Overflow的第一篇文章,所以我希望我不要踩到任何人的脚趾.
当然,所有的输入都是受欢迎和赞赏的,但那些最适合回答的人实际上会阅读C编程语言第二版.
我刚刚完成了练习6-4的编码,但我似乎无法解决问题.为什么getword()函数在按Ctrl + D(我在Arch Linux VM中使用C代码)之前不会读取EOF?
我之前的许多练习都需要从stdin中读取.我会做的一种方式是通过类似的东西
while ((c = getchar()) != EOF) {...}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我永远不必按Ctrl + D. 我在输入中输入,按Enter键,stdin缓冲区被刷新,并自动检测到EOF.getword()函数也依赖于它的基础上的getchar(),为什么它会挂起我的程序?
从main()调用getword()函数:
while (getword(word, MAX_WORD) != EOF) {
if (isalpha(word[0])) {
root = addtree(root, word);
}
}
Run Code Online (Sandbox Code Playgroud)
getword()函数本身:
int getword(char *word, int lim) {
char *w = word;
int c;
while (isspace(c = getch())) {
}
if (c != EOF) {
*w++ = c;
}
// This point is reached
if (!isalpha(c)) {
// This point is never reached before …Run Code Online (Sandbox Code Playgroud) 我正在对OllyDbg中的应用程序进行一些内联修改,并注意到一些奇怪的行为.
这些是我写的指令,直接从调试器复制:
2005FE35 4C DEC ESP
2005FE36 77 21 JA SHORT 2005FE59 ; 23 byte difference
Run Code Online (Sandbox Code Playgroud)
为了清楚起见,我只修改了操作码(4C 77 21); 其他一切都由OllyDbg自动解释,这就是我的困惑.该指令应该递减ESP寄存器,然后执行21个十六进制字节的条件跳转.但是,地址0x2005FE59和0x2005FE36之间的差异不是21 - 它是23!
使用21个十六进制字节值,我观察到看似不稳定的结果.
2005FE36 77 20 JA SHORT 2005FE58 ; 22 byte difference
2005FE36 77 19 JA SHORT 2005FE51 ; 1B byte difference
2005FE36 77 17 JA SHORT 2005FE4F ; 19 byte difference
Run Code Online (Sandbox Code Playgroud)
我指示向前跳转的十六进制字节数与地址偏移量不匹配; 它似乎永远都是2.
这里发生了什么?