字符串流和格式化

stringstreams and formatting

本文关键字:格式化 字符串      更新时间:2023-10-16

我正在使用c++编写一个程序,该程序应该与素数做一堆事情。然而,主要的问题是,我有麻烦转换之间的整数和字符串。我认为以下是相关代码:

for(int j=0;j<size-1;j++){
  num=primes[j];
  ss<<num;
  ss>>temp;
  ss.str("");
  for (int count=0; count < temp.size(); count++) {
      cout<<temp<<endl;
  }

我知道我可以谷歌一下并找出如何从整数转换成另一种方式。然而,我有一种感觉,我不能弄清楚什么是错的原因是,因为我缺乏一些关于stringstreams的基本知识,我不知道我希望可以修复。num是int型,ss是stringstream, cout temp每次输出2,这是primes[0]的值。我认为stringstream可能在第一次尝试后没有读取,因为与换行字符有关,但我真的不知道。

您所经历的原因是,在将第一个值读取到temp后,EOF_BIT将在ss中设置,之后不能对std::stringstream进行读写操作,因此temp不会用新值更新。

用一种更容易理解的方式来解释上面的内容;std::stringstream ss将认为它已经到达终点(它在某一点上确实到达了终点)。你需要告诉它"从头再来"。(重置所有错误标志),以便在下一次迭代中可用。


如何解决这个问题?

有一些可用的方法,对我来说最清楚的(在代码可读性方面)是为循环中的每个迭代器使用一个新的std::stringstream(参见"示例解决方案#2)。

查看下面所有将输出的代码片段:

2
3
5
7
11
13
17

例解#1
  int const PRIMES_SIZE         = 7;
  int const primes[PRIMES_SIZE] = {2,3,5,7,11,13,17};
  std::stringstream ss; 
  std::string temp;
  for (int i =0; i < PRIMES_SIZE; ++i) {
    ss << primes[i];
    ss >> temp;
    std::cout << temp << std::endl;
    ss.clear (); // unset error flags
  }

例2
  int const PRIMES_SIZE         = 7;
  int const primes[PRIMES_SIZE] = {2,3,5,7,11,13,17};
  for (int i =0; i < PRIMES_SIZE; ++i) {
    std::stringstream ss;
    ss << primes[i];
    std::cout << ss.str () << std::endl;
  }

解例#3
  #include <iterator>
  ...
  int const PRIMES_SIZE         = 7;
  int const primes[PRIMES_SIZE] = {2,3,5,7,11,13,17};
  std::stringstream ss;
  std::copy (primes, primes+PRIMES_SIZE, std::ostream_iterator<int> (ss, "n"));
  std::cout << ss.str ();