【问题标题】:How to insert a string at x position in another string?如何在另一个字符串的x位置插入一个字符串?
【发布时间】:2020-04-22 05:01:55
【问题描述】:

我必须使用一个函数,该函数接受两个字符串和一个整数值,它告诉在第一个字符串中输入第二个字符串的位置。

例如:

String 1 = "I have apple"
String 2 = "an " 
position = 6, 

输出:

String 1 = "I have an apple"

到目前为止,这是我的代码:

#include <iostream>
using namespace std;

const int SIZE=102;

void insertString(char str1[ ],char str2[ ],int position);

int main()
{
    char str1[SIZE], str2[SIZE];
    int position,i=0,j=0;

    cout<<"Enter string 1 of atmost 50 characters:\n";
    cin.getline(str1,SIZE/2);

    cout<<"Enter string 2 of atmost 50 characters:\n";
    cin.getline(str2,SIZE/2);

    cout<<"Enter Position number where String 2 is to be inserted: ";
    cin>>position;

    while(position<0||position>50)
    {
        cout<<"Invalid input. Enter a positive Position number less than 51\n"<<
        "where String 2 is to be inserted: ";
        cin>>position;
    }

    insertString(str1,str2,position);

    cout<<"Modified string 1: "<<str1<<endl;

    system("pause");
    return 0;
}

/******************************************************************************
Definition of function insertString:

This function takes two C-string in form of character arrays and one integer value
as parameters

It inserts String 2 in String 1 on the required position. 

*******************************************************************************/

void insertString(char str1[ ],char str2[ ],int position)
{
    char temp[SIZE]; 
    int i,j,countStr2;

    for(j=0;j<SIZE&&str2[j]!=0;j++)
        countStr2=j;

    for(i=position,j=0;i<SIZE,j<=countStr2; i++,j++)
    {
        temp[i]=str1[i];
        str1[i]=str2[j];

    }

}

这个逻辑覆盖了字符串1的一些字符,我该怎么办?

任何帮助将不胜感激。

【问题讨论】:

  • 你不使用std::string有什么原因吗?
  • 我建议现在学习它。使用char[] 是一件非常 C 的事情……否则,您知道问题在于覆盖。所以,您已经创建了一个char temp[SIZE],但您似乎没有正确使用它。将值暂时存储在那里,然后使用它们。
  • 还是没有?使用std::string,您可以使用insert
  • std::string str1 = "I have apple"; std::string str2 = "an"; int position = 6; str1.insert(position, str2);
  • 请注意,您有temp,但它在该功能之外的用途是什么?这是一个措辞不佳的赋值,因为当该函数返回时,实际上不会插入任何内容。这就是为什么像这样以C 方式做事需要在设计方面多加思考。插入的字符串应该在哪里返回给调用者?以什么形式?一个新的字符串?用户提供的现有缓冲区?复制到str1?您需要告诉我们这些信息。使用std::string,该字符串将被更改,无需提问。

标签: c++ arrays string function


【解决方案1】:
#include<cstring>
#include <iostream>
/*The following function supposes that str1 and str2 are cString (i.e)
ended by `\0` and inserts str2 in str1 at the specified position in a
newStr, then returns the new string as apointer*/

char* insertString(const char str1[ ],const char str2[ ],const int& position)
{
    int shiftedPos=position-1;
    int str2Size=strlen(str2);
    int str1Size=strlen(str1);
    int newSize=str2Size+str1Size+1;

    char* newStr=new char[newSize];
    for(int i=0; i<shiftedPos; i++) newStr[i]=str1[i];

    for(int i=0; i<str2Size; i++) newStr[shiftedPos+i]=str2[i];
    for(int i=0; i<newSize; i++) newStr[shiftedPos+str2Size+i]=str1[shiftedPos+i];

    newStr[newSize]='\0';

    return newStr;
}
int main(){
    auto str1 = "I have apple";
    auto str2 = "an ";
    std::cout<<insertString(str1,str2, 8);
    return 0;
}

另一个完全按照您的意愿执行的代码

#include<iostream>
#include<cstring>
/*The following function supposes that str1 and str2 are cString (i.e)
ended by `\0` and that the memory allocated by str1 >= the len(str1)+len(str2)+1.
It inserts str2 in str1 at the specified position in str1*/

void insertString(char str1[ ], char str2[ ], int position)
{
    int str1Size=strlen(str1);
    int str2Size=strlen(str2);
    int newSize=str2Size+str1Size+1;
    int cppPosition=position-1;

    for(int i=str1Size; i>=cppPosition; i--) str1[i+str2Size]=str1[i];
    for(int i=0; i<str2Size; i++) str1[cppPosition+i]=str2[i];
    str1[newSize]='\0';
}
int main(){
    char str1[50]= "I have apple";
    char str2[50] = "an ";
    insertString(str1,str2, 8);
    std::cout<<str1;
    return 0;
}

【讨论】:

    【解决方案2】:

    假设你可以使用&lt;string&gt;,那么我会使用std::string::substr:

      #include <string>
    
      std::string originalString = "I have apple"; // original string
      std::string insert = " an "; // added space beforehand for the new word to be inserted
      int position = 6; // index where the new word would be inserted
    
      int remainingStringSize = originalString.length() - position - 1; // count how many characters remain from the position you're inserting
    
      std::string combinedString = originalString.substr(0, 6) + insert + originalString.substr(position +1, remainingStringSize); // resulting combined string
    

    请注意,您显然需要检查以下内容:

    • 该索引位置在您要插入的原始字符串的长度范围内
    • 剩余的字符数大于 0

    【讨论】:

      【解决方案3】:

      如果你必须实现void insertString(char str1[ ],char str2[ ],int position)函数,你这里没有太多选择。

      一种可能的解决方案是将第一个字符串中的字符向右移动,以便为要插入的第二个字符串腾出空间。

      这种方法可能如下所示:

      void insertString(char str1[], char str2[], int position) {
          const int len1 = strlen(str1);
          const int len2 = strlen(str2);
      
          // First, shift all the characters from the given position to the right by `len2` positions:
          for (int i = 0; i < len1 - position; ++i) {
              str1[len1 - i - 1 + len2] = str1[len1 - i - 1];
          }
          // Then insert the second string in the given position:
          for (int i = 0; i < len2; ++i) {
              str1[position + i] = str2[i];
          }
          // Make sure to create a new terminator since the
          // previous one got overwritten by the the first loop
          str1[len1 + len2 + 1] = 0;
      }
      

      LIVE DEMO


      注意,这可能是不安全的!如果str1 数组中没有足够的空间来存储另一个strlen(str2) 字符,则会导致缓冲区溢出。

      更安全的选择是为堆上的新连接字符串分配一个新缓冲区,但为了您的分配,这应该足够了。

      由于您使用的是 C++,因此您应该在任何生产代码中完全避免这种方法,例如,将 char 数组替换为 std::string。但是我已经在 cmets 中读到了你还不能使用它。

      【讨论】:

        猜你喜欢
        • 2011-05-20
        • 2019-07-31
        • 2012-09-25
        • 1970-01-01
        • 2015-02-11
        • 1970-01-01
        • 2011-08-18
        • 2013-11-24
        相关资源
        最近更新 更多