问题描述
书中的一个例子:
#include <stdio.h>
main()
{
int c;
c = getchar();
while (c != EOF) {
putchar(c);
c = getchar();
}
}
现在这本书没有解释太多,而是说 getchar() 读取下一个字符输入。我相信在循环必须对输入缓冲区做一些事情之前 c = getchar()
的原因。我已经对它进行了研究,但仍然无法完全理解它。在此示例中,删除 c = getchar()
不会对程序的运行方式产生影响。
在循环之前 c = getchar()
的确切原因是什么?它与输入缓冲区有什么关系?另外:如何输入EOF?按 Enter 或 -1 不会终止循环,因此在这种情况下我不明白在这种情况下如何检查 EOF。
解决方法
如果您在循环之前删除 const provider = new ethers.providers.WebSocketProvider(config.network);
const tradeWallet = ethers.Wallet.fromMnemonic(config.mnemonic);
const account = tradeWallet.connect(provider);
const router = new ethers.Contract(
'0x10ED43C718714eb63d5aA57B78B54704E256024E',[
'function getAmountsOut(uint amountIn,address[] memory path) public view returns (uint[] memory amounts)','function swapExactTokensForTokens(uint amountIn,uint amountOutMin,address[] calldata path,address to,uint deadline) external returns (uint[] memory amounts)'
],account
);
[snip]
var amountIn = ethers.utils.parseUnits('0.001','ether');
var tokenIn = '0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c';
var tokenOut = '0xd2de3fd31b5c9e1557cf329032615a2870a29ccd';
var gasPrice = '5000000000';
var gasLimit = '231795'
var amounts = await router.getAmountsOut(amountIn,[tokenIn,tokenOut])
const amountOutMin = amounts[1].sub(amounts[1].div(10));
// values at the time where:
// tokenIn: 100000000000000 0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c (WBNB)
// tokenOut: 1810636794711288351 0xd2de3fd31b5c9e1557cf329032615a2870a29ccd
var tx = router.swapExactTokensForTokens(
amountIn,amountOutMin,tokenOut],addresses.recipient,Date.now() + 1000 * 60 * 3,//10 minutes
{ gasPrice: gasPrice,gasLimit: gasLimit
}
);
const receipt = await tx.wait();
,则在第一次进入循环时 c = getchar();
的值将不确定。所以在打印一个字符和读取下一个字符之前,需要有一个值来读取。
要输入 EOF,您可以按 CTRL-D 或 CTRL-Z,具体取决于您使用的是 Linux 还是 Windows。