getchar() 和输入缓冲区

问题描述

书中的一个例子:

#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。