c ++用2星代替空格

时间:2015-03-14 11:25:33

标签: c++ string replace

我正在尝试制作一个用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]='*';
                 }
           }
        }
    }

4 个答案:

答案 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 ++代码!我还使用mallocfree来符合代码的一般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()。虽然它也适用于那个......