我正在尝试制作一个用2星代替字符串中所有空格的C ++程序。在编译时,程序没有显示任何输出,因为我认为空字符被覆盖或其他东西,正如我的计算机老师所说。但是尽管在函数中嵌套for循环中反复干运行和调整,我可以'发现出了什么问题。到底是什么导致了这个问题?
//program to replace every space in string with 2 stars
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
void convert(char str[]);
int main()
{
system("cls");
char string[50];
cout<<"Enter a string "<<endl;
gets(string);
convert(string);
cin.get();
return 0;
}
void convert(char str[])
{
int i, j;
for(i=0; str[i]!='\0'; i++)
{
if(str[i]==' ')
{
for(j=strlen(str); j>i; j--)
{
str[j]=str[j+1];
str[i]='*';
str[i+1]='*';
}
}
}
}
答案 0 :(得分:2)
替换
str[j] = str[j+1];
使用
将字符移近开头str[j+1] = str[j];
将它们移得更远。移动循环后面的两行。
您还有其他事情需要解决:
string
。如果不是这样,请使用std::string
而不是C字符串fgets(string,sizeof(string), cin)
代替本身不安全的gets
答案 1 :(得分:0)
没有输出的主要原因是代码中没有cout << string
。即使有错误也会存在。
str[j]=str[j+1];
不应该有str[j+1]=str[j];
。 str[j+1]
甚至没有设置j==strlen(str)
。
此外,必须在内部循环之后将字符设置为星号,以便空格后的第一个字符不会被星号覆盖,以便可以移动它。
此外,如果您可以使用std::string
,则可以更好,更轻松地使用它。你不需要内循环,只需要调用一次std::string::replace()
。
以下是代码:
if (str[i] == ' ')
{
for (j = strlen(str); j>i; j--)
{
str[j+1] = str[j];
}
str[i] = '*';
str[i+1] = '*';
}
答案 2 :(得分:0)
首先,我假设这是作业,你不能使用std::string
。如果您可以使用std::string
,请忘记所有内容并避免使用动态分配的C风格字符串!
我们走了。如果要用两个字符(两个星号)替换一个字符(空格),那么输出字符串将变为更大。
"hello there, world!" = 19 characters
"hello**there,**world!" = 21 characters
我怀疑用星号覆盖每个空格后面的角色是否符合本练习的要求:
"hello**here,**orld!" = 19 characters, but seems to be wrong
你有49个字符的空间,但是如果你输入一个包含45个非空格和5个空格的字符串怎么办?结果将包含55个字符。更一般地说:谁说结果字符串适合旧数组?
解决此问题并获得满意解决方案的最简单方法是首先计算空格数,然后分配新字符串,然后复制字符。
这是一个例子。我保留了接收用户输入的原始方式,以及代码中的一些其他问题,尽管它可以使用一些进一步的改进。这是不您将在生产中使用的C ++代码!我还使用malloc
和free
来符合代码的一般C风格(事实上,这可能真的是一个C练习!)。严格把它作为学习练习:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
int new_size(char str[]);
char* convert(char str[], int new_size);
int main()
{
char string[50];
cout<<"Enter a string "<<endl;
gets(string);
int new_size_with_stars = new_size(string);
char* new_string = convert(string, new_size_with_stars);
printf("result: %s\n", new_string);
free(new_string);
return 0;
}
int new_size(char str[])
{
int result = 0;
for (int i = 0; str[i] != '\0'; ++i)
{
if (str[i] == ' ')
{
++result;
}
++result;
}
return result;
}
char* convert(char str[], int new_size)
{
char* new_str = (char*) malloc(new_size + 1);
for(int old_str_index = 0, new_str_index = 0; str[old_str_index] != '\0'; ++old_str_index, ++new_str_index)
{
if (str[old_str_index]==' ')
{
new_str[new_str_index] = '*';
new_str[new_str_index + 1] = '*';
++new_str_index;
}
else
{
new_str[new_str_index] = str[old_str_index];
}
}
new_str[new_size] = '\0';
return new_str;
}
答案 3 :(得分:0)
你不应该使用gets()
,它是一个已被弃用的功能,被认为是危险的。如果您使用的是C ++,则无需使用cstring
,C ++可以为此提供更好的解决方案。我用这种方式做这种事:
//program to replace every space in string with 2 stars
#include<iostream>
#include<string>
using namespace std;
string convert(string str) {
size_t pos = 0;
while ((pos = str.find(" ", pos)) != string::npos) {
str.replace(pos, 1, "*");
pos += 1;
}
return str;
}
int main()
{
system("cls");
string str;
cout<<"Enter a string "<<endl;
getline(cin,str);
cout<<convert(str);
cin.get();
return 0;
}
但如果你坚持使用cstring
,那么修改你的代码:
//program to replace every space in string with 2 stars
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
void convert(char str[]);
int main()
{
system("cls");
char string[50];
cout<<"Enter a string "<<endl;
cin.getline(string,sizeof(string));
convert(string);
cout<<string;
cin.get();
return 0;
}
void convert(char str[])
{
int i, j;
for(i=0; str[i]!='\0'; i++)
{
if(str[i]==' ')
{
for(j=strlen(str); j>i; j--)
{
str[j+1]=str[j];
str[i]='*';
str[i+1]='*';
}
}
}
}
至少你不应该使用gets()。虽然它也适用于那个......