接受字符串的输入

Taking input of a string

提问人:R_Squared 提问时间:4/23/2022 更新时间:4/23/2022 访问量:51

问:

#include <bits/stdc++.h>
using namespace std;

string solve(string s){
    cout << "inside solve";
    for(int i=0; i<s.length(); i++){
        int occur=0;
        while(i+1 < s.length()){
            if(s[i] == s[i+1])
                occur++;
        }
        if(occur%2!=0 && occur%3!=0 && occur%5!=0)
            return "no";
    }
    cout << "inside solve";
    return "yes";
}

int main(){
    ios_base::sync_with_stdio(0);
    //cin.tie(0); cout.tie(0);
    int tc;
    cin >> tc;
    //cout << tc;
    while(tc--){
        string s;
        cin >> s;
        //cout << "Inside main's while";
        cout << solve(s);
    }
    return 0;
}

在我的主函数中,输入字符串后,什么也没发生。使用 cin >> s 有问题吗?同样,当我取消注释行 cin.tie(0);cout.tie(0); 它也不会进入内部,而循环。那么发生了什么?

C++ 字符串 输入 IO

评论

0赞 Lala5th 4/23/2022
s[i] == s[i+1]将在某个时候引用字符串之外的内存,这是未定义的行为。另外:什么是调试器?
4赞 user4581301 4/23/2022
不幸的是,这是一个常见的问题。您似乎正在尝试使用竞赛网站的代码自学C++。竞赛守则并非旨在教授。它旨在赢得比赛。由于速度限制,它很快就被冲掉了,几乎没有描述性文本,并且经常有评判系统没有寻找的错误,因此当它实际上存在严重缺陷时,它有资格成为正确答案。你想做的是从信誉良好的来源学习C++,然后,如果你愿意,竞争乐趣,练习,只是为了挑战自己。
4赞 HolyBlackCat 4/23/2022
必读:为什么我不应该 #include < bits/stdc++.h>?为什么“使用命名空间std”被认为是不好的做法?
0赞 user4581301 4/23/2022
while(i+1 < s.length())应限制范围以保持在范围内。此外,在循环中不递增有助于防止它到达任何地方,更不用说越界了。i+1iwhile

答:

1赞 A M 4/23/2022 #1

你在这里有一个无限的循环:

        while(i+1 < s.length()){
            if(s[i] == s[i+1])
                occur++;
        }

“i”在 lopp 中未被修改。循环将永远运行。条件始终为真。

使用第二个变量 k=i+1,在 while 循环中取此值,并将 s[i] 与 s[k++] 进行比较。

不要继续与这些所谓的“竞争方”合作