告诉C++中的cin在换行处停止读取

36

假设我想从输入中读取这样的整数行a:

1 2 3 4 5\n

我希望cin在遇到'\n'字符时停止输入,但是cin似乎无法识别它。

以下是我的代码:

vector<int> getclause() {
  char c;
  vector<int> cl;

  while ( cin >> c && c!='\n') {    
    cl.push_back(c);
    cin>>c;
  }
  return cl;
}

我应该如何修改这个程序,才能使cin在遇到'\n'字符时停止读取?


9
cin命令是以空格为分隔符的,所以任何空格(包括\n)都会被忽略。因此,变量c不可能是\n - crashmstr
6个回答

43

使用getline和istringstream:

#include <sstream>
/*....*/
vector<int> getclause() {
  char c;
  vector<int> cl;
  std::string line;
  std::getline(cin, line);
  std::istringstream iss(line);
  while ( iss >> c) {    
    cl.push_back(c);
  }
  return cl;
}

我得到了变量 'std :: istringstream iss' 具有初始化程序但不完整的类型。 - Mark
getline 也在命名空间 std 中,我认为。 - Drew Dormann
3
这句话的意思是你需要 #include <sstream>。这个信息几乎总是意味着一个类型被声明了,但你缺少了实际的定义。换句话说,你缺少了一个头文件。 - Drew Dormann
@Drew Dormann已经修复了,我错过了那个:D。关于std::istringstream错误,只需像示例代码中所示包含sstream即可。 - mfontanini

4

您可以通过在 istream 上设置 noskipws 来读取所有空白字符:

#include <ios>
#include <iostream>
#include <vector>

using std::vector;

vector<int> getc() {
    char c;
    vector<int> cl;
    std::cin >> std::noskipws;
    while (std::cin >> c && c != '\n') {
        cl.push_back(c);
        std::cin >> c;
    }
    return cl;
}

如果标准输入仅包含单行内容,您可以使用 istream_iterator 构建向量:

#include <iostream>
#include <iterator>
#include <vector>

using std::vector;

vector<int> getc() {
    // Replace char with int if you want to parse numbers instead of character codes
    vector<int> cl{
        std::istream_iterator<char>(std::cin),
        std::istream_iterator<char>()
    };
    return cl;
}

2
您可以使用getline方法先获取一行文本,然后使用istringstream从该行文本中获取格式化输入。

1
使用std::getline,这将解决问题。

0

getchar() 在处理字符时比 cin 更高效。

我尝试使用一行未知长度的字符,并希望在换行符处停止,但它进入了一个无限循环并且没有检测到换行符,所以我只好使用 getchar() 而不是 cin,这样就可以正常工作了。


-2

从这个链接,实现这个非常简单。

#include <stdio.h>
int main(void) {
    int i=0,size,arr[10000];
    char temp; 
    do{
        scanf("%d%c", &arr[i], &temp); 
        i++; 
        } while(temp!= '\n');

    size=i; 
    for(i=0;i<size;i++){ 
        printf("%d ",arr[i]); 
    } 
    return 0;
}

抱歉,是 C++,不是 C。 - jww

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接