这是我在这里的代码,我试图一次找到最大长度的相同长度字符,例如“ a a a bb bb bc sa sa a a
”,因此答案是两个字符同时相邻5次,每次5次。
这是我的代码,我的问题是,当我尝试接受输入时,对于我的第一个输入,它不会进入getline,而是最后一行中的printf,然后接受一行并打印输出
就像我给
5它写1然后需要getline,但是我希望它先使用getline而不是printf,这样我的5个输入就打印出1和4个期望的输出。我想要5个可以告诉我原因。
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
int main()
{
int a,j;
scanf("%d",&a);
for(j=0;j<a;j++)
{
vector<int> v;
string s;
getline(cin,s);
int i,cnt =0;
for(i=0;i<s.length();i++)
{
if(s[i] != ' ')
{
cnt++;
}
else
{
v.push_back(cnt);
cnt =0;
}
}
v.push_back(cnt);
int k=0;
int ps =0;
int sp=0;
while(k<v.size()-1)
{
if (v[k+1] - v[k] == 0)
{
sp++;
k++;
}
else
if (sp >= ps)
{
ps = sp;
k++;
sp=0;
}
else
{
k++;
sp=0;
}
}
if (sp<ps)
printf("%d",ps+1);
else
printf("%d",sp+1);
}
return 0;
}
最佳答案
您不应该将scanf
与getline
混合使用,尝试仅使用其中一个(而getline
是更好的选择)。
发生的情况是scanf
一旦完成读取int
就会停止解析。它不会占用您键入的行尾字符,也不会消耗您在该数字之后输入的任何其他字符。因此,getline
提取第一行中剩下的所有内容(可能只是换行符char)。
一个“快速”但肮脏的解决方法是更改您的scanf
调用,以使其在int
之后吞下空白:
scanf("%d ",&a);
// ^ notice the space there
但这不是真正的解决办法。使用
getline
和字符串流(在<sstream>
中)获取第一个数字,您的代码将按预期工作。您可以在以下常见问题解答中找到使用istringstream
提取数字的示例:How to convert a number to string and vice versa in C++您可能还对另一个问题感兴趣:
Split a string in C++?,答案演示了一种拆分字符串的方法,这种方法比您在此处执行的操作不容易出错。
关于c++ - 循环操作不正确,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10868417/