提问人:Speak Dony 提问时间:3/24/2022 最后编辑:Remy LebeauSpeak Dony 更新时间:3/24/2022 访问量:401
字符串程序(替换字母)
String program(replace letter)
问:
我需要你在Turbo C++程序方面的帮助。
我需要使用字符串创建一个程序。写任何句子,在句子中,我需要找到第一个或字母,然后写在它前面。b
B
cb
例如:
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();
}
答:
2赞
Remy Lebeau
3/24/2022
#1
你只是在替换现有的角色,你不会移动任何角色来为新角色腾出空间。
因此,例如,如果输入 ,将如下所示:dasdasB
m
----------------------------------
| d | a | s | d | a | s | B | \0 |
----------------------------------
您所做的只是将第二个替换为 ,将第二个替换为:a
c
s
b
----------------------------------
| 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 个空格,向后循环,直到到达索引处的 / 字符。
b
B
i
话虽如此,如果您使用数组而不是数组,则此代码会容易得多,就像 find_first_of(
) 和 insert()
方法一样,例如:std::string
char[]
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::vector
new[]
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
别担心,伙计。每个人都必须从某个地方开始。希望将来如果你继续练习,你会变得更好。
评论
cin>>m;
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++,就这么简单。