web-dev-qa-db-fra.com

Comment utiliser la fonction string.substr ()?

Je veux faire un programme qui lira un certain nombre au format chaîne et le produira comme ceci: si le nombre est 12345, il devrait alors produire 12 23 34 45. J'ai essayé d'utiliser la fonction substr () de la bibliothèque de chaînes c ++, mais cela me donne des résultats étranges - elle génère 1 23 345 45 au lieu du résultat attendu. Pourquoi ?

#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
int main(void)
{
    string a;
    cin >> a;
    string b;
    int c;

    for(int i=0;i<a.size()-1;++i)
    {
        b = a.substr(i,i+1);
        c = atoi(b.c_str());
        cout << c << " ";
    }
    cout << endl;
    return 0;
}
36
VaioIsBorn

Si j'ai raison, le deuxième paramètre de substr() devrait être la longueur de la sous-chaîne. Que diriez-vous

b = a.substr(i,2);

?

65
Ghislain Fourny

Comme indiqué ici , le deuxième argument de substr est la longueur , pas la position de fin:

string substr ( size_t pos = 0, size_t n = npos ) const;

Générer une sous-chaîne

Renvoie un objet chaîne avec son contenu initialisé à une sous-chaîne de l'objet actuel. Cette sous-chaîne est la séquence de caractères qui commence à la position de caractère pos et a une longueur de n caractères.

Votre ligne b = a.substr(i,i+1); va générer, pour les valeurs de i:

substr(0,1) = 1
substr(1,2) = 23
substr(2,3) = 345
substr(3,4) = 45  (since your string stops there).

Ce dont vous avez besoin est b = a.substr(i,2);

Vous devez également savoir que votre sortie aura l'air drôle pour un nombre comme 12045. Vous obtiendrez 12 20 4 45 Du fait que vous utilisez atoi() sur la section de chaîne et que entier. Vous voudrez peut-être simplement essayer de sortir la chaîne elle-même qui sera longue de deux caractères:

b = a.substr(i,2);
cout << b << " ";

En fait, le tout pourrait être plus simplement écrit comme suit:

#include <iostream>
#include <string>
using namespace std;
int main(void) {
    string a;
    cin >> a;
    for (int i = 0; i < a.size() - 1; i++)
        cout << a.substr(i,2) << " ";
    cout << endl;
    return 0;
}
21
paxdiablo

Une autre variante intéressante peut être:

Comment feriez-vous "12345" comme "12 23 34 45" sans utiliser une autre chaîne?

Est-ce que les suivants feront l'affaire?

    for(int i=0; i < a.size()-1; ++i)
    {
        //b = a.substr(i, 2);
        c = atoi((a.substr(i, 2)).c_str());
        cout << c << " ";
    }
3
Rajendra Uppal

substr(i,j) signifie que vous commencez à partir de l'index i (en supposant que le premier index est 0) et que vous prenez les caractères j suivants. Cela ne veut pas dire remonter à l'index j.

2
user1611542

Solution possible sans utiliser substr()

#include<iostream>
#include<string>

using namespace std;


int main() {
    string c="12345";
    int p=0;

    for(int i=0;i<c.length();i++) {
        cout<<c[i];
        p++;

        if (p % 2 == 0 && i != c.length()-1) {
            cout<<" "<<c[i];
            p++;
        }
    }
}
2
lionelmessi

Vous pouvez obtenir la sortie ci-dessus en utilisant le code suivant en c

#include<stdio.h>
#include<conio.h>
#include<string.h>
int main()
{
  char *str;
  clrscr();
  printf("\n Enter the string");
  gets(str);
  for(int i=0;i<strlen(str)-1;i++)
  {
    for(int j=i;j<=i+1;j++)
      printf("%c",str[j]);
    printf("\t");
  }
  getch();
  return 0;
}
2
Shrihari Jadhav

Solution possible avec string_view

void do_it_with_string_view( void )
{
    std::string a { "12345" };
    for ( std::string_view v { a }; v.size() - 1; v.remove_prefix( 1 ) )
        std::cout << v.substr( 0, 2 ) << " ";
    std::cout << std::endl;
}
0
antb52