字符串程序(替换字母)

String program(replace letter)

提问人:Speak Dony 提问时间:3/24/2022 最后编辑:Remy LebeauSpeak Dony 更新时间:3/24/2022 访问量:401

问:

我需要你在Turbo C++程序方面的帮助。

我需要使用字符串创建一个程序。写任何句子,在句子中,我需要找到第一个或字母,然后写在它前面。bBcb

例如:

acdcb -> acdccbb

我试着这样做,但只能像替换一样做。我刚开始学习字符串,所以我有这样的代码:

#include <iostream.h>
#include <conio.h>
#include <string.h>

int main()
{
    clrscr();
    const int N=100;
    char m[N];
    char r[]="cb";
    int p=0,kb=0;
    cout<<"Sentence: ";
    cin>>m;
    p=strlen(m);
    cout<<"String length = "<<p<<"\n";
    for(int i=0;i<p;i++)
    {
        if(m[i]=='b'||m[i]=='B')
        {
            kb++;
            if(kb==1)
            {
                m[i-1]='b';
                m[i-2]='c';
            }
        }
    }
    cout<<"New Sentence : "<<m;
    p=strlen(m);
    cout<<"\ncount of letters = "<<p;
    getch();
}

image

C 字符串 turbo-c++

评论

3赞 user4581301 3/24/2022
旁注:Turbo C++ 是 Ooooooold。从C++中可以吸取一些教训,这些经验教训今天仍然可以应用,但是该语言本身已经过时了20多年,而C++已经发展了。如果这是一门课程,请做你必须做的事情来通过课程,但在你去寻找编程工作之前,你应该从一些关于现代 C++ 的最新材料中学习。
2赞 user4581301 3/24/2022
旁注:当它碰到第一个空格字符时停止,所以它更好地描述为阅读单词,而不是句子。cin>>m;
0赞 PaulMcKenzie 3/24/2022
std::string s; ... for (int i = 0; i < p; ++i) { if ( m[i] == 'B' || m[i] == 'b' ) s += "cb"; s += m[i]; } std::cout << s;-- 如果你像 1998 年以来那样使用 C++,就这么简单。
0赞 PaulMcKenzie 3/24/2022
@user4581301 -- 在世界某些地区,给学生提供涡轮C++似乎是一种“传统”。问题在于,学生认为他们正在学习现在的 C++,而不知道他们正在学习的内容与实际的 C++ 世界几乎没有关系。令人惊讶的是,学生可以使用的现代和最新的编译器是完全免费的。我可以理解较新的编译器是否要花费数百或数千美元,但事实并非如此。真的没有理由把Turbo C++甩给任何学生。
0赞 Mark Ransom 3/24/2022
@PaulMcKenzie内置的 IDE 和快速的编译/运行周期使 Turbo C++ 成为一个有用的学习工具,即使它教错了东西。另外,如果您要更改课程材料,还需要更新它。

答:

2赞 Remy Lebeau 3/24/2022 #1

你只是在替换现有的角色,你不会移动任何角色来为角色腾出空间。

因此,例如,如果输入 ,将如下所示:dasdasBm

----------------------------------
| d | a | s | d | a | s | B | \0 |
----------------------------------

您所做的只是将第二个替换为 ,将第二个替换为acsb

----------------------------------
| d | a | s | d | c | b | B | \0 |
----------------------------------
                  ^   ^   ^
                 i-2 i-1  i

相反,您需要将所有字符(包括和之后)移动到右侧的 2 个空格:B

------------------------------------------
| d | a | s | d | a | s | --|-> | B | \0 |
------------------------------------------
                          ^   ^

然后,您可以填充刚刚创建的空白区域:

------------------------------------------
| d | a | s | d | a | s | c | b | B | \0 |
------------------------------------------
                          ^   ^

我将把它作为一个练习,让你弄清楚如何进行这种转变。

提示:使用另一个从字符串末尾开始的循环(您已经知道字符串的长度),将字符移动到右侧 2 个空格,向后循环,直到到达索引处的 / 字符。bBi


话虽如此,如果您使用数组而不是数组,则此代码会容易得多,就像 find_first_of() 和 insert() 方法一样,例如:std::stringchar[]std::string

#include <iostream>
#include <string>
//#include <conio.h>
using namespace std;

int main()
{
    //clrscr();
    string m;
    cout << "Sentence: ";
    cin >> m;
    cout << "String length = " << m.size() << "\n";
    string::size_type i = m.find_first_of("bB");
    if (i != string::npos) {
        m.insert(i, "cb");
    }
    cout << "New Sentence : " << m << "\n";
    cout << "count of letters = " << m.size();
    cin.get();
}

在线演示

评论

0赞 Speak Dony 3/24/2022
如果第一个字母 B/b 不是最后一个字母,我该怎么办?
0赞 Remy Lebeau 3/24/2022
B/b 是否是字符串中的最后一个字符并不重要。移动所有字符,包括 B/b 并在 B/b 之后,直到为要插入的新字符腾出空间。
0赞 Daniyal Ishfaq 3/24/2022 #2

您需要创建一个大小为 3 的新数组,其中 c 和 b 将占用 2 个字符,最后一个字符为 '\0',表示 char 数组的结束。我有一个代码可以对你有所帮助。它在 b 字符之前再添加两个字符 c 和 b。

#include <iostream>
#include <string.h>
using namespace std;
int main()
{
    const int N=100;
    char m[N];
    char r[]="cb";
    int p=0,kb=0;
    cout<<"Sentence: ";
    cin>>m;
    p=strlen(m);
    cout<<"String length = "<<p<<"\n";
    char *result = new char [p+3];
    for(int i=0;i<p;i++)
    {
        if(m[i]=='b'||m[i]=='B')
        {
            kb++;
            if(kb==1)
            {
                for (int j=0; j<i; j++)
                {
                    result[j] = m[j];
                }
                result[i]='c';
                result[i+1]='b';
                for (int j=i+2, k=i; k<p; j++, k++)
                {
                    result[j] = m[k];
                }
                result[p+2] = '\0';
            }
        }
    }
    cout<<"New Sentence : "<<result;
    p=strlen(m);
    cout<<"\ncount of letters = "<<p;
}

评论

0赞 user4581301 3/24/2022
char result[p+3];不是合法的 C++ 代码。一些编译器,特别是 GCC,添加可变长度数组 (VLA) 作为扩展,而那些通常遵循与 C99 的 VLA 相同的规则的编译器,但对于不支持 VLA 的 C++ 编译器,不能使用您的答案。我已经有大约 30 年没有使用过 Turbo C++ 了,但我强烈怀疑它不支持 VLA。它也不支持 ,推荐的替换。这迫使询问者使用 / 来获取动态数组。std::vectornew[]delete[]
0赞 Daniyal Ishfaq 3/24/2022
是的,你是对的,我们需要使用 new 来分配内存。我将更新我的答案。谢谢你指出来。
0赞 user4581301 3/24/2022
此外,提问者似乎还承担了更复杂的工作,即在现有数组中执行插入操作。否则,我将完全忘记第二个数组,并将更新的字符串直接输出到输出流中逐个字符,在写入触发它们的字符之前写出插入的字符。
0赞 Speak Dony 3/24/2022
伙计们,请回答。Idk,也许对我来说这个问题太难了,或者只是我太糟糕了。最后,我创建的程序 - 有多糟糕?对不起我的英语。因为我在大学的 2 门编程课程学习,但它在 UA(就像 11 门课)。我为那个程序失去了 3 小时的生命,但最终没有创建它
0赞 Daniyal Ishfaq 3/24/2022
别担心,伙计。每个人都必须从某个地方开始。希望将来如果你继续练习,你会变得更好。