加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何通过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以了解您正在做什么以及它将具有哪些其他效果(以及你是否想做其他事情).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读