cin 不能正确接受输入
cin does not accept input properly
我使用下面的代码获取输入
int main() {
int x=0,value=0;
cin>>x;
string str;
for(int i=0;i<x;++i){
cin>>str;
value = findpalindrome(str);
cout<<value<<endl;}
return 0;
}
这些是我的测试用例:
3
xabcbayabbaz
abcbaabc
abcba
代码接受第一个字符串并给出输出。但是,当我输入接下来的两个字符串时,它只是在等待更多输入。我尝试在没有循环的情况下单独提供输入,但这也没有用。编译器无限等待更多输入。
我将我的全部代码放在这里以供参考。
#include <iostream>
#include <string.h>
using namespace std;
struct palindrome{
int start;
int end;
int strlength;
}s[20];
bool checkifpalindrome(string str)
{
string str1=str;
for(int i=0;i<str.length()/2;++i){
char temp=str1[i];
str1[i]=str1[str.length()-1-i];
str1[str.length()-1-i]=temp;
}
if(str1.compare(str)==0)
return true;
return false;
}
bool checkoverlap(int cur_pos,int prev_pos){
if((s[cur_pos].start>=s[prev_pos].start && s[cur_pos].start<=s[prev_pos].end)||
(s[cur_pos].end>=s[prev_pos].start && s[cur_pos].end<=s[prev_pos].end))
return true;
else
return false;
}
int findmax(int count){
int max = 0;
int pos = 0;
for(int i=0;i<count;++i){
if (s[i].strlength>max){
max = s[i].strlength;
pos = i;
}
}
return pos;
}
int findpalindrome(string str)
{
int sum=0;
int count=-1;
string str1;
for(int i=0;i<str.length();++i){
for(int j=1;j<str.length()-i+1;++j){
str1=str.substr(i,j+1);
if(checkifpalindrome(str1)){
count++;
s[count].start=i;
s[count].end=i+j;
s[count].strlength=str1.length();
}
}
}
int pos[2];
pos[0]=findmax(count);
sum+=s[pos[0]].strlength;
s[pos[0]].strlength=0;
pos[1]=findmax(count);
int i=0,n=10;
while(i<n){
if(s[pos[0]].strlength==str.length())
break;
else if(checkoverlap(pos[1],pos[0])){
s[pos[1]].strlength=0;
pos[1]=findmax(count);
continue;
}
else if(s[pos[1]].strlength==0)
break;
else{
sum+=s[pos[1]].strlength;
break;
}
i++;
}
return sum;
}
int main() {
int x=0,value=0;
cin>>x;
string str;
for(int i=0;i<x;++i){
cin>>str;
value = findpalindrome(str);
cout<<value<<endl;}
return 0;
}
请注意,findpalindrome
函数的 while
循环中的 i++
行将 永远不会 执行 - 循环将退出(在 break
)或从头开始(在继续)。
从该循环中的第一个 else if
块中删除 continue;
行可防止程序进入无限循环 - 但我无法验证它是否修复了 all 你的问题(比较有符号类型和无符号类型的案例很多,可能 有问题)。
启用(完整)编译器警告(并注意它们)在这种情况下很有帮助!对于您的原始代码,clang-cl 给出(除其他外):
warning : code will never be executed [-Wunreachable-code]
除了@Adrian Mole 的回答之外,最好通过删除像 findpalindrome()
这样的中间函数来检查这些事情,只是为了确保输入值被正确读取并且问题不在其中.
我使用下面的代码获取输入
int main() {
int x=0,value=0;
cin>>x;
string str;
for(int i=0;i<x;++i){
cin>>str;
value = findpalindrome(str);
cout<<value<<endl;}
return 0;
}
这些是我的测试用例:
3
xabcbayabbaz
abcbaabc
abcba
代码接受第一个字符串并给出输出。但是,当我输入接下来的两个字符串时,它只是在等待更多输入。我尝试在没有循环的情况下单独提供输入,但这也没有用。编译器无限等待更多输入。
我将我的全部代码放在这里以供参考。
#include <iostream>
#include <string.h>
using namespace std;
struct palindrome{
int start;
int end;
int strlength;
}s[20];
bool checkifpalindrome(string str)
{
string str1=str;
for(int i=0;i<str.length()/2;++i){
char temp=str1[i];
str1[i]=str1[str.length()-1-i];
str1[str.length()-1-i]=temp;
}
if(str1.compare(str)==0)
return true;
return false;
}
bool checkoverlap(int cur_pos,int prev_pos){
if((s[cur_pos].start>=s[prev_pos].start && s[cur_pos].start<=s[prev_pos].end)||
(s[cur_pos].end>=s[prev_pos].start && s[cur_pos].end<=s[prev_pos].end))
return true;
else
return false;
}
int findmax(int count){
int max = 0;
int pos = 0;
for(int i=0;i<count;++i){
if (s[i].strlength>max){
max = s[i].strlength;
pos = i;
}
}
return pos;
}
int findpalindrome(string str)
{
int sum=0;
int count=-1;
string str1;
for(int i=0;i<str.length();++i){
for(int j=1;j<str.length()-i+1;++j){
str1=str.substr(i,j+1);
if(checkifpalindrome(str1)){
count++;
s[count].start=i;
s[count].end=i+j;
s[count].strlength=str1.length();
}
}
}
int pos[2];
pos[0]=findmax(count);
sum+=s[pos[0]].strlength;
s[pos[0]].strlength=0;
pos[1]=findmax(count);
int i=0,n=10;
while(i<n){
if(s[pos[0]].strlength==str.length())
break;
else if(checkoverlap(pos[1],pos[0])){
s[pos[1]].strlength=0;
pos[1]=findmax(count);
continue;
}
else if(s[pos[1]].strlength==0)
break;
else{
sum+=s[pos[1]].strlength;
break;
}
i++;
}
return sum;
}
int main() {
int x=0,value=0;
cin>>x;
string str;
for(int i=0;i<x;++i){
cin>>str;
value = findpalindrome(str);
cout<<value<<endl;}
return 0;
}
请注意,findpalindrome
函数的 while
循环中的 i++
行将 永远不会 执行 - 循环将退出(在 break
)或从头开始(在继续)。
从该循环中的第一个 else if
块中删除 continue;
行可防止程序进入无限循环 - 但我无法验证它是否修复了 all 你的问题(比较有符号类型和无符号类型的案例很多,可能 有问题)。
启用(完整)编译器警告(并注意它们)在这种情况下很有帮助!对于您的原始代码,clang-cl 给出(除其他外):
warning : code will never be executed [-Wunreachable-code]
除了@Adrian Mole 的回答之外,最好通过删除像 findpalindrome()
这样的中间函数来检查这些事情,只是为了确保输入值被正确读取并且问题不在其中.