|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
对输入的一句子实现查找且置换的功能(找到某个子串并换成另一子串)。
比如:将“abcf abdabc”中的“abc”,替换为“AA”,则替换结果为“AAf abdAA”,而将“abcf abdabc”中的“abc”替换为“abcabc”,则替换结果为“abcabcf abdabcabc”。本题查找子串时注意,大小写完全一致,才能作为子串,比如:在“Abcf abd Abc”中,如果找字符串“abc”是不存在的。
输入
第一行为原来的字符串 第二行为要查找的子串 第三行为要替换成的子串。
输出
只有一行,为替换好的字符串
样例输入
abcf abdabc
abc
AA
样例输出
AAf abdAA
哪里有问题?
#include<bits/stdc++.h>
using namespace std;
int main(){
string s, s1, s2;
int pos;
getline(cin, s);
getline(cin, s1);
getline(cin, s2);
pos = s.find(s1, 0);
while (pos != -1){
s.replace(pos, s1.size(), s2);
pos = s.find(s1, 0);
}
cout << s;
return 0;
}
- 主要问题:
- 函数 func 定义错误:
- func 函数的参数定义错误,尤其是默认参数 s1 和 num 的位置和类型不对。num 应该是传引用的方式来修改它的值。
- s 和 s1 的重复声明,导致函数定义混乱。
- string::find 返回 -1 代表没有找到,但应该用 string::npos 来表示。
- 主函数中的逻辑问题:
- cin >> s 只读取字符串的第一个单词,而你需要使用 getline 来读取包含空格的完整行。
- 循环控制条件 for (i=0, i<n-1, i++) 使用逗号分隔应该改为 for (int i = 0; i < n; ++i)。
- 没有正确地传递 num 到 func 函数中,也没有在 func 返回后更新 num。
- 修正后的代码:
- #include <iostream>
- #include <string>
- using namespace std;
- // func 函数删除空格并返回删除空格后的字符串,同时更新删除的空格数量
- string func(string& s, int& num) {
- string result;
- for (char c : s) {
- if (c != ' ') {
- result += c; // 非空格字符添加到结果字符串中
- } else {
- num++; // 记录删除的空格数
- }
- }
- return result;
- }
- int main() {
- int n, num = 0;
- cin >> n; // 输入字符串的数量
- cin.ignore(); // 处理换行符
- string s;
-
- // 存储每个字符串并删除空格
- for (int i = 0; i < n; ++i) {
- getline(cin, s); // 读取完整的一行
- string result = func(s, num); // 删除空格并得到结果
- cout << result << endl; // 输出删除空格后的字符串
- }
-
- // 输出删除的空格总数
- cout << num << endl;
-
- return 0;
- }
- 解释:
- func 函数:
- func 现在返回删除空格后的字符串,并且通过引用修改 num 来跟踪删除的空格数。
- 我们使用一个新的字符串 result 来存储删除空格后的字符。每次遇到空格时,num 增加。
- 主函数:
- cin >> n 用来读取字符串数量,然后 cin.ignore() 用来忽略换行符,防止它干扰后续的 getline。
- 使用 getline(cin, s) 来读取每行字符串(包含空格)。
- 然后调用 func 函数处理字符串,输出删除空格后的字符串。
- 最后输出总共删除的空格数。
- 样例输出:
- 假设输入是:
- 3
- Yan ke lei
- iiiii
- acac aca c ac
- 输出会是:
- Yankelei
- iiiii
- acacacacac
- 9
复制代码
|
|