鱼C论坛

 找回密码
 立即注册
查看: 45|回复: 2

[已解决]对输入的一句子实现查找且置换的功能(找到某个子串并换成另一子串)。

[复制链接]
发表于 6 天前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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;
}
最佳答案
6 天前
主要问题:
函数 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 6 天前 | 显示全部楼层
您在代码中缺失了必要的头文件及某些部分。以下是具体的问题及改正:

1. **缺失头文件**:没有包含必需的头文件 `<iostream>` 和 `<string>`。
2. **反复查找子串的位置有误**:在 `replace` 之后查找下一个子串时,应该从上次替换的位置往后找,而不是从头开始,否则容易陷入死循环。
3. **输出部分缺失**:`cout` 没有完全写出输出语句。

以下是修正后的代码,并解释改正的地方:
#include <iostream>
#include <string>
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); // 查找子串 s1 在 s 中的初始位置

    while (pos != string::npos) { // 用 string::npos 替代 -1,更符合 C++ 标准
        s.replace(pos, s1.size(), s2);
        pos = s.find(s1, pos + s2.size()); // 从当前替换结束后的位置继续查找
    }

    cout << s << endl; // 输出替换后的字符串
    return 0;
}

**改正点:**
1. 添加了 `#include <iostream>` 和 `#include <string>`。
2. 使用 `string::npos` 来判断 `find` 的返回值是否有效,代替 `-1`。
3. 在 `pos = s.find(s1, pos + s2.size())` 中,调整了查找范围,避免重复查找相同的子串。

运行以上代码,您可以正确完成子串查找和置换功能。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 6 天前 | 显示全部楼层    本楼为最佳答案   
主要问题:
函数 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-21 18:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表