【问题标题】:c++ converting string to intc ++将字符串转换为int
【发布时间】:2011-11-04 18:55:03
【问题描述】:
//sLine is the string
for(int l = 0; l < sLine.length(); l++)
{
    string sNumber;
    if(sLine[l] == '-')
    {   
        sNumber.push_back(sLine[l]);
        sNumber.push_back(sLine[l + 1]);
        l++;
    }
    else if(sLine[l] != '\t')
    {
        sNumber.push_back(sLine[l]);
    }
    const char* testing = sNumber.c_str();
    int num = atoi(testing);
    cout << num;
}

我有这个 for 循环,它检查字符串的每个字符并将该字符串中的每个数字转换为 int。但是由于某种原因,atoi 函数会执行两次,所以当我 cout 时,它会出于某种原因显示两次……这是为什么呢?

示例: 输入 3 3 -3 9 5
-8 -2 9 7 1
-7 8 4 4 -8
-9 -9 -1 -4 -8

输出 3030-309050 -80-20907010
-70804040-80
-90-90-10-40-80

【问题讨论】:

  • sNumber.push_back(sLine[l + 1]); 可以访问超出字符串结尾。
  • @Vlad 但我把它放在那里是因为负数......
  • 整个循环执行了两次。
  • 您能否展示一个输出示例,用于某些输入?在不相关的注释中,使用isdigit 而不是检查'\t',以防万一。 :)
  • std::string s = "45"; int i = boost::lexical_cast&lt;int&gt;(s);顺便说一句

标签: c++ string int


【解决方案1】:

它对所有无法识别的字符显示为零,因为atoi 在给定非数字字符串时返回0(如空格!)

然而,你想做的事,却非常简单:

std::stringstream ss(sLine);
int num;
while(ss >> num) {
    cout << num;
}

【讨论】:

    【解决方案2】:

    移动这个:

    const char* testing = sNumber.c_str();
    int num = atoi(testing);
    cout << num;
    

    在您粘贴的代码中的最后一个 } 下方,即在 for 循环之外。目前,sLine 中的每个字符都有单独的打印输出,因为它在循环的每次迭代中执行。 (sLine 中的最后一个字符可能是换行符,因此即使您认为自己只写了一个数字,也会发生这种情况。)

    编辑:还将sNumber 的声明 移到 for 循环之上。

    您可能还想将if (sLine[l] == '-') 更改为if (sLine[l] == '-' &amp;&amp; (l + 1) &lt; sLine.length()),这样如果破折号是该行的最后一个字符,您就不会访问超出字符串末尾的内容。

    您可能还想将变量 l 重命名为看起来不太像 1 的名称。 =)

    您可能还想重新考虑这样做是否是正确的方法(通常如果一件简单的事情变得如此复杂,那么您很可能做错了)。

    【讨论】:

    • sNumber 将超出范围
    【解决方案3】:

    您为非数字字符输出额外的0。问题是atoi 在无法转换输入时返回 0,因此您的空格将打印为零。

    【讨论】:

      【解决方案4】:

      这似乎是一种痛苦的方式来重新创建轮子。你最好使用字符串流来解析它。

      std::stringstream strm(sLine);
      int num;
      while(strm >> num)
      {
          std::cout << num << std::endl;
      }
      

      【讨论】:

      • 请不要鼓励使用eof()fail() 作为循环条件。这样做几乎总是会导致代码错误。而是做while ( strm &gt;&gt; num ) { ... } 。演示eof()的邪恶力量:ideone.com/ZKa67
      猜你喜欢
      • 2021-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-07
      • 1970-01-01
      • 1970-01-01
      • 2013-11-12
      相关资源
      最近更新 更多