Je dois remplacer tous les caractères «a» par «aaa» dans une chaîne.
Alors, ce que j'essaye de faire. Si l'entrée est water, la sortie doit être comme ceci: waaater.
J'ai essayé ceci:

#include <iostream>
#include <string.h>

using namespace std;

int main ()
{
  char s[100], t[100];
  int i;
  cout << "The string is: " << endl;
  cin.get (s, 100);
  strcpy (t, s);
  for (i = 0; i < strlen (s); i++)
    if (s[i] == 'a')
      strcat (strcpy (s + i, "aa"), t + i);
  cout << "The modified string  is: " << endl;
  cout << s;
}

Mais la sortie est Segmentation fault (core dumped).
Je ne sais pas ce qui ne va pas et je ne sais pas quoi changer où.

0
paokv 15 mars 2021 à 00:55

3 réponses

Meilleure réponse

Vous essayez de modifier s sur place, mais après chaque remplacement de 'a' par "aaa", vous n'ignorez pas les nouveaux a que vous venez d'insérer, vous arrêtez donc jusqu'à les remplacer également, c'est-à-dire water -> waaater -> waaaaater -> waaaaaaater, et ainsi de suite dans une boucle sans fin jusqu'à ce qu'une erreur se produise.

Essayez plutôt ceci:

#include <iostream>
#include <string.h>

using namespace std;

int main ()
{
    char s[100], t[100];
    int i, j;

    cout << "The string is: " << endl;
    cin.get (s, 100);

    strcpy (t, s);
    for (i = 0, j = 0; i < strlen (s); i++, j++) {
        if (s[i] == 'a') {
            strcat (strcpy (s + i, "aa"), t + j);
            i += 2;
        }
    }

    cout << "The modified string is: " << endl;
    cout << s;
}

Démo

Alternativement:

#include <iostream>
#include <string.h>

using namespace std;

int main ()
{
    char s[100];

    cout << "The string is: " << endl;
    cin.get(s, 100);

    int len = strlen(s);
    for (int i = 0; i < len; i++) {
        if (s[i] == 'a') {
            if ((len+3) > sizeof(s)) break; // no more space!
            memmove(s+(i+3), s+(i+1), sizeof(s)-(i+1));
            s[i+1] = 'a'; s[i+2] = 'a';
            i += 2;
            len += 2;
        }
    }

    cout << "The modified string is: " << endl;
    cout << s;
}

Démo

Cependant, si vous utilisez std::string au lieu de {{X1} }, vous pouvez ensuite utiliser std::string::find() et < a href = "https://en.cppreference.com/w/cpp/string/basic_string/replace" rel = "nofollow noreferrer"> std::string::replace() méthodes, par exemple:

#include <iostream>
#include <string>

using namespace std;

int main ()
{
    string s;

    cout << "The string is: " << endl;
    cin >> s;

    string::size_type pos = 0;
    do {
        pos = s.find('a', pos);
        if (pos == string::npos) break;
        s.replace(pos, 1, "aaa");
        pos += 3;
    }
    while (true);

    cout << "The modified string is: " << endl;
    cout << s;
}

Démo

Vous pouvez également utiliser std::string::insert() à la place, par exemple:

#include <iostream>
#include <string>

using namespace std;

int main ()
{
    string s;

    cout << "The string is: " << endl;
    cin >> s;

    string::size_type pos = 0;
    do {
        pos = s.find('a', pos);
        if (pos == string::npos) break;
        s.insert(pos, "aa");
        // or: s.insert(pos, 2, 'a');
        pos += 3;
    }
    while (true);

    cout << "The modified string is: " << endl;
    cout << s;
}

Démo

1
Remy Lebeau 15 mars 2021 à 00:24

Une simple regex le ferait.

#include <iostream>
#include <regex>
#include <string>

int main() {
 std::string text = "water";
 std::regex replace("a");

 std::cout << std::regex_replace(text, replace, "aaa") << std::endl;

 return 0;
}

Il remplace "eau" par "waaater" comme vous le vouliez.

3
Varius 14 mars 2021 à 22:06

Supposons old_string = "water". Sa longueur est de 5. Il a 1 'a'. Par conséquent, new_string doit être de longueur new_length = old_length + (2 * number_of_a). Dans notre cas, 7. Déclarez un tableau de caractères de taille new_length + 1 (+1 pour un caractère nul).

char new_string[8];

Définissez une variable j sur 0. Exécutez maintenant une boucle while de 0 à 7 inclus avec i étant la variable de boucle. À l'intérieur de la boucle, vérifiez d'abord si i est égal à 7. Si OUI, définissez new_string[i] = '\0'; Sinon, définissez new_string[i] = old_string[j]; À l'intérieur du même bloc ELSE, vérifiez maintenant si old_string[j] == 'a' Si OUI, incrémentez i et définissez new_string[i] = old_string[j]; Exécutez la ligne précédente une fois de plus. Maintenant, en dehors du bloc ELSE, incrémentez j, incrémentez i.

0
mindoverflow 14 mars 2021 à 22:32