【问题标题】:Number of substrings starting and ending with '1' [duplicate]以“1”开头和结尾的子字符串数[重复]
【发布时间】:2021-02-08 02:10:16
【问题描述】:

我正在尝试查找以 '1' 开头和结尾的子字符串的数量,其中输入字符串是 1111、10001 等数字。给定的代码未显示正确的输出,但如果我将 getline 替换为 cin 作为输入方法代码工作正常。如果我跳过 n 的输入(n 是要输入的字符串的长度)并在 for 循环中使用 i

#include <iostream>
#include <string>
using namespace std;
    
int main(){
    int n;
    cin>>n;
    string str;
    getline(cin,str);
    int c=0;
    for(int i=0;i<n;i++)
    if(str[i]=='1')
    c++;
    c=c*(c+1)/2;
    cout<<c;

    return 0;
}

【问题讨论】:

  • 使用调试器也可以查看str 的值,或者在循环前转储std::cout &lt;&lt; "'" &lt;&lt; str &lt;&lt; "'\n";
  • @S.M.我确实尝试过这样做,但据我了解,上面的代码由于某种原因跳过了getline,因此str 没有输出。但cin 不会发生这种情况。

标签: c++ string c++11 substring


【解决方案1】:

这是因为getline 会读取n 之后的所有字符,直到包括空格在内的行尾。因此,str 的长度将等于 n+1,因为开头有空格。

如何修复(例如):for(int i = 1; i &lt; n + 1; i++)

【讨论】:

  • 我试过这样做,但我仍然面临同样的问题。事实上,当我使用getline 而不是cin 时,我什至无法输入str。这部分代码被跳过了。
【解决方案2】:

共享代码的可能问题是:

  1. 首先在变量“n”中收集输入,然后通过 getline() 将其分配给字符串变量似乎是多余的。预期的工作可以通过使用单个 getline() 语句来完成:“getline(cin,str);”

  2. for循环中变量'n'的用法:变量'n'是获取输入字符串的长度(这样循环就可以比较字符串的所有元素与数字'1'。根据您尝试执行 for 循环“n”次的共享代码,我认为这不是这里的期望。) 例如:如果字符串输入是“111”,那么循环将被执行 111 次,它应该运行 3 次(如果我对代码动机的理解不同,请纠正?) 当前循环条件检查肯定会给出“字符串下标超出范围”断言失败。

    int n; 辛 >> n; 字符串 str; 获取线(cin,str); 诠释 c = 0; 对于 (int i = 0; i

根据我的理解,上面的代码行可以替换为下面的代码块。

string str;
getline(cin, str);
int c = 0;
int n = str.size();
for (int i = 0; i < n; i++)
{}

【讨论】:

  • n 采用str 的大小。所以如果str 是'1111',那么n 就是'4'(我已经编辑了这个问题以便更好地理解)。但即使有这个输入,我也无法获得所需的输出。我知道如果我跳过n 的输入,它会起作用。但我想知道为什么这不起作用,因为这在我看来在逻辑上是正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-28
  • 1970-01-01
  • 2012-10-27
  • 2021-12-17
  • 2023-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多