如何通过bash shell cin c string> = 1024个字符?
发布时间:2020-12-15 21:06:08 所属栏目:安全 来源:网络整理
导读:在os X 10.8上,我尝试通过bash将std输入重定向到c string. 我打印第1024个字后,我甚至无法按回车键. 你能解释一下问题出在哪里以及如何解决问题吗? 解决方法 这个问题与bash或C代码无关.为了验证这一点,这个简单的程序有同样的问题: #include iostream#inc
在os X 10.8上,我尝试通过bash将std输入重定向到c string.
我打印第1024个字后,我甚至无法按回车键. 你能解释一下问题出在哪里以及如何解决问题吗? 解决方法
这个问题与bash或C代码无关.为了验证这一点,这个简单的程序有同样的问题:
#include <iostream> #include <string> int main(int,char**) { std::string s; std::getline(std::cin,s); } 这个Python程序也是如此: #!/usr/bin/python raw_input() 你可以尝试在不同的shell下运行,看看它没有任何区别. 问题是线路模式下的TTY始终具有最大线路长度,而这个线路的最大线路长度恰好为1024. 所以,这甚至不是一个编程问题;这是一个TTY问题.这就是为什么你可以在superuser.com而不是在这里找到重复的原因.请参阅那里有关处理此问题的各种方法的讨论. 但是,如果要从程序中而不是全局处理它,可以检查stdin是否为tty,如果是,则使用termios函数暂时关闭行模式.例如,像这样: #include <iostream> #include <string> #include <termios.h> #include <unistd.h> int main(int,char**) { struct termios told; if (isatty(STDIN_FILENO)) { tcgetattr(STDIN_FILENO,&told); struct termios tnew = told; tnew.c_lflag &= ~ICANON; tcsetattr(STDIN_FILENO,TCSAFLUSH,&tnew); } std::string s; std::getline(std::cin,s); if (isatty(STDIN_FILENO)) { tcsetattr(STDIN_FILENO,&told); } } 但是,您显然需要真正的错误处理,并且您可能希望使用RIAA来存储和恢复原始的termios设置,并且您应该阅读man termios以了解您正在做什么以及它将具有哪些其他效果(以及你是否想做其他事情). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |