c++ 如何给字符串中的字符加上点字符?

uqzxnwby  于 2023-01-03  发布在  其他
关注(0)|答案(5)|浏览(192)

我想在一个字符串中添加一个.“”字符,但是我不知道该怎么做?有可能吗?

#include <iostream>

#include <string.h>

using namespace std;

int main(int argc, char *argv[]) {

    string input;
    char dot='.';
    cin>>input;
    for(int i=0;i<input.length();i++)
    {

        if( input[i]>=65 && input[i]<=90)
                {
                    input[i]=input[i]+32;   
                }
        if( (input[i]=='a') || (input[i]=='e') || (input[i]=='i') ||  (input[i]=='o') || input[i]=='y'  || input[i]=='u' )
        {
            input.erase(i,i+1);
        }
        input[i]+=dot;
    }
    cout<<input<<endl;
    return 0;
}
yyyllmsg

yyyllmsg1#

来自cpluplus.com参考(http://www.cplusplus.com/reference/string/string/insert/

// inserting into a string
#include <iostream>
#include <string>
using namespace std;

int main ()
{
  string str="to be question";
  string str2="the ";
  string str3="or not to be";
  string::iterator it;

  // used in the same order as described above:
  str.insert(6,str2);                 // to be (the )question
  str.insert(6,str3,3,4);             // to be (not )the question
  str.insert(10,"that is cool",8);    // to be not (that is )the question
  str.insert(10,"to be ");            // to be not (to be )that is the question
  str.insert(15,1,':');               // to be not to be(:) that is the question
  it = str.insert(str.begin()+5,','); // to be(,) not to be: that is the question
  str.insert (str.end(),3,'.');       // to be, not to be: that is the question(...)
  str.insert (it+2,str3.begin(),str3.begin()+3); // (or )

  cout << str << endl;
  return 0;
}

此外,请检查以下链接:
http://www.cplusplus.com/reference/string/string/append/

zyfwsgd6

zyfwsgd62#

在编写代码之前,您应该详细说明它应该做什么。对于您的代码,我只能猜测:转换为小写字母(天真地,假设你只会遇到ASCII中的26个非重音字母),然后删除所有元音字母(同样,非常天真地,因为即使在英语中,判断某个字符是否是元音字母也不是一件小事--考虑yet和day中的y),最后在每个字符后面插入一个点,最明显的方法如下:

std::string results;
for ( std::string::const_iterator current = input.begin(),
                end = input.end();
        current != end;
        ++ current ) {
    static std::string const vowels( "aeiouAEIOU" );
    if ( std::find( vowels.begin(), vowels.end(), *current )
                != vowels.end() ) {
        results.push_back(
            tolower( static_cast<unsigned char>( *current ) ) );
    }
    results.push_back( '.' );
}

但我还是要说,我只是在猜测你想做什么。
另一种方法是在初始字符串上使用std::transform,使其全部小写,如果你经常这样做,你将得到一个ToLower函数对象;否则,仅仅为了能够使用std::transform一次而编写一个脚本可能会非常麻烦。

1zmg4dgp

1zmg4dgp3#

我假设您需要以下输入:

Hello world!

要提供此输出:

h.ll. w.rld!

您不必尝试在适当的位置修改字符串,只需在执行过程中生成一个新字符串即可:

#include <cctype>
#include <iostream>
#include <string>
using namespace std;

int main(int argc, char *argv[]) {
    string input;
    getline(cin, input);
    string output;
    const string vowels = "aeiouy";
    for (int i = 0; i < input.size(); ++i) {
        const char c = tolower(input[i]);
        if (vowels.find(c) != string::npos) {
            output += '.';
        } else {
            output += c;
        }
    }
    cout << output << '\n';
    return 0;
}

注:

  • <cctype>代表toupper()
  • <string.h>已弃用;使用<string>
  • getline()读取整行; istream::operator>>()读取字。
  • 使用tolower()toupper()等进行字符变换。c + 32不能描述您的意图。
  • 当您需要比较时,c >= 'A' && c <= 'Z'将起作用;你不需要使用ASCII码。
  • 使用const来处理那些不会改变的事情。
ig9co6j1

ig9co6j14#

我不知道这个老问题是如何回到当前列表中的,但在查看答案后,看起来如果输入的不止一个单词,所有的都将错过标记。从您的注解中,似乎您希望删除所有元音,并在删除之前的字符之前放置一个'.'。因此,您的示例"tour"变为".t.r"
从其他的答案中吸取经验,并无耻地将'y' as从元音列表中删除,您可以执行类似的操作:

#include <iostream>
#include <string>

int main()
{
  std::string input;
  if (!getline (std::cin, input)) {
    return 1;
  }

  size_t i = 0;
  for (; input[i]; i++)
  {
    switch (input[i])
    {
      case 'A':     /* case fall-through intentional */
      case 'E':
      case 'I':
      case 'O':
      case 'U':
      case 'a':
      case 'e':
      case 'i':
      case 'o':
      case 'u':
      {
        size_t pos = input.find_first_not_of("AEIOUaeiou", i+1);
        if (pos == std::string::npos) {
          pos = input.length();
        }
        input.erase(i, pos-i);
        if (pos - i > 1) {
          input.insert(i, 1, '.');
        }
        input.insert(i-1, 1, '.');
        break;
      }
    }
  }

  std::cout << input << '\n';
}
    • 使用/输出示例**

您的示例:

$ ./bin/vowels-rm-mark
tour
.t.r

一个更长的例子:

$ ./bin/vowels-rm-mark
My dog has fleas and my cat has none.
My .dg .hs f.l.s. nd my .ct .hs .n.n.
9udxz4iz

9udxz4iz5#

根据您的评论,您似乎想要这样的内容:

#include <iostream>
#include <string>
#include <algorithm>

int main(int argc, char *argv[])
{
    std::string input;
    std::cin >> input;

    std::transform (input.begin(), input.end(), input.begin(), tolower);

    size_t i = 0;
    while (i < input.length())
    {
        switch (input[i])
        {
            case 'a':
            case 'e':
            case 'i':
            case 'o':
            case 'y':
            case 'u':
            {
                size_t pos = input.find_first_not_of("aeioyu", i+1);
                if (pos == std::string::npos)
                  pos = input.length();
                input.erase(i, pos-i);
                break;
            }

            default:
            {
                input.insert(i, 1, '.'); // or: input.insert(i, ".");
                i += 2;
                break;
            }
        }
    }

    std::cout << input << std::endl;
    return 0;
}

相关问题