告诉cin停止在newline阅读

tell cin to stop reading at newline

本文关键字:newline 阅读 cin 告诉      更新时间:2023-10-16

假设我想从输入中读取整数的行a,如下所示:

1 2 3 4 5n

我想让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"字符时停止?

使用getline和distingstream:

#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;
}

您可以通过在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;
}

您可以使用getline方法首先获取该行,然后使用istringstream从该行获取格式化的输入。

使用std::getline,这将完成

getchar()在这种情况下处理字符时比cin更高效

我试着对一行长度未知的字符做同样的处理,并希望它停在换行符处,但它有一个无限循环,并且没有检测到换行符,所以我只使用了getchar()而不是cin,它可以在上运行

通过这个链接,实现这一点非常简单。

#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;
}