字符串流和格式

时间:2011-12-26 01:54:06

标签: c++ string-formatting stringstream

我正在使用C ++并编写一个应该用素数做一堆事情的程序。然而,主要问题是我在int和字符串之间转换时遇到问题。我相信以下是相关代码:

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

我知道我可以谷歌并弄清楚如何从另一种方式转换整数。但是,我有一种感觉,我无法弄清楚出了什么问题的原因是因为我缺乏一些关于字符串流的基本知识,我不知道哪些是我希望可以修复的。 num是一个int,ss是一个字符串流,cout temp每次打印出2,这是primes[0]的值。我认为字符串流可能在第一次试用后没有读取,因为与换行符有关,但我真的不知道。

1 个答案:

答案 0 :(得分:2)

您遇到的原因是,在将第一个值读入ss后,将在temp中设置EOF_BIT,之后不会对{{1}进行读/写操作因此std::stringstream未使用新值更新。

更加人性化的解释方法; std :: stringstream temp会认为它已经到了终点(它有一点)。您需要告诉它“重新开始”(重置所有错误标志),以便在另一次迭代中可以使用。


如何解决此问题?

有一些方法可供我使用,最明确的(在代码可读性方面)是为循环中的每个迭代器使用一个新的ss(参见“示例解决方案#2 )。

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

std::stringstream

示例解决方案#1

2
3
5
7
11
13
17

示例解决方案#2

  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
  }

示例解决方案#3

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