Cum se utilizează funcția string.substr()? (Programare, C++, String, Substring)

VaioIsBorn a intrebat.

Vreau să fac un program care să citească un număr în format string și să îl dea la ieșire astfel: dacă numărul este 12345 ar trebui să dea la ieșire 12 23 34 34 45 . Am încercat să folosesc funcția substr() din biblioteca de șiruri c++, dar îmi dă rezultate ciudate – scoate 1 23 345 45 în loc de rezultatul așteptat. De ce?

#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;
}

Comentarii

  • atoi nu ar trebui să fie folosită –  > Por phuclv.
7 răspunsuri
Ghislain Fourny

Dacă nu mă înșel, al doilea parametru al substr() ar trebui să fie lungimea subșirului. Cum ar fi

b = a.substr(i,2);

?

utilizator283145

Comentarii

  • Da, el incrementează de fiecare dată lungimea substringului. –  > Por Seth Moore.
paxdiablo

După cum se arată aici, , al doilea argument pentru substr este lungime, și nu poziția finală:

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

Generați o subșiruire

Returnează un obiect șir de caractere al cărui conținut este inițializat ca fiind o subșiră a obiectului curent. Această subșir este secvența de caractere care începe la poziția caracterului pos și are o lungime de n caractere.

Linia dvs. b = a.substr(i,i+1); va genera, pentru valori de i:

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

Ceea ce aveți nevoie este b = a.substr(i,2);

De asemenea, trebuie să știți că rezultatul va arăta ciudat pentru un număr precum 12045. Veți obține 12 20 4 45 din cauza faptului că folosiți atoi() în secțiunea string și scoaterea acelui număr întreg. Poate doriți să încercați să scoateți doar șirul de caractere, care va fi va avea o lungime de două caractere:

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

De fapt, întregul lucru ar putea fi scris mai simplu ca:

#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;
}

Rajendra Uppal

O altă variantă interesantă de întrebare poate fi:

Cum ați face "12345" ca "12 23 34 45" fără a folosi un alt șir de caractere?

Ar fi de ajuns următoarele?

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

Shrihari Jadhav

Puteți obține rezultatul de mai sus folosind următorul cod în c

#include<stdio.h>
#include<conio.h>
#include<string.h>
int main()
{
  char *str;
  clrscr();
  printf("
 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;
}

Comentarii

lionelmessi

Soluție posibilă fără a utiliza 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++;
        }
    }
}

user1611542

substr(i,j) înseamnă că începeți de la indexul i (presupunând că primul indice este 0) și luați următorul j caractere.Aceasta nu înseamnă că trebuie să urcați până la indexul j.

antb52

Soluție posibilă cu 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;
}