Как преобразовать строку, такую ​​​​как 12 | 34 | 56 | 78, и вывести 12, 34, 56, 78 в С++

мне нужно сделать конструктор Convert, который принимает строку. Эта строка будет содержать целые числа в виде строки символов, числа разделены символом |. Например, если параметр представляет собой следующую строку «12|34|56|78», результирующий объект будет иметь следующие значения: 12, 34, 56 и 78.

for(int i=0; i<8; i++)
{
    if(s[i]!='|')
        cout<<s[i]<<s[i+1]<<", ";

}

это то, что я сделал до сих пор, но на выходе я получаю «12, | 2, 34, | 3 ..», как мне сделать это «12, 34, 56, 78»?


person user7940400    schedule 20.11.2017    source источник
comment
См. эту программу: ide.geeksforgeeks.org/95lTim3PoX   -  person msc    schedule 20.11.2017
comment
@rsp спасибо, сработало и было очень просто   -  person user7940400    schedule 20.11.2017
comment
я просто хочу уточнить, запятая не нужна, что я должен сделать, это вывести пару чисел без |   -  person user7940400    schedule 20.11.2017
comment
Ваш вывод не соответствует вашему коду. Вы должны получить 12, 2|, 34, 4|, 56, 6|,   -  person Thomas Sablik    schedule 20.11.2017


Ответы (7)


Просто найдите и замените все

std::string s("12|34|56|78");
for (auto f = s.find('|'); f != string::npos; f = s.find('|')) {
    s.replace(f, 1, ", ");
}
std::cout << s << std::endl;

или, если у вас есть строка в стиле C и вы просто хотите получить требуемый результат

char s[] = "12|34|56|78";

for (int i = 0; s[i]; i++) {
    if (s[i] == '|') {
        cout << ", ";
    }
    else {
        cout << s[i];
    }
}
person Shreevardhan    schedule 20.11.2017

Как есть, вы печатаете символ |, даже если условие if равно true. Используя ваш подход, измените код на:

std::string s = "12|34|56|78";
for (std::size_t i = 0; i < s.size(); i++)  {
    if (s[i] == '|') {
        std::cout << ", ";
    }
    else {
        std::cout << s[i];
    }
}

Если вы хотите изменить саму строку, объедините std::string::find и std::string::replace работают как показано в ответе Шривардхана.

person Ron    schedule 20.11.2017

Если вы хотите изменить строку с '|' на строку с ',', вы можете попробовать использовать функцию заменить из стандартного.

std::replace( s.begin(), s.end(), '|', ',');
person Lukingan    schedule 20.11.2017
comment
Я проголосовал за это из-за подхода, даже думал, что ОП тоже хотел пробел после каждой запятой. - person Steve; 20.11.2017
comment
ОП хочет заменить "|" на ", ". Это не отвечает на вопрос. - person Lundin; 20.11.2017

Что вам нужно создать, так это метод разделения строк:

//Split string -- reusable
vector<string> splitString(string str, string delimiter)
{
  vector<string>v;
  string token;
  size_t pos = 0;

  while((pos = str.find(delimiter)) != string::npos)
    {
      token = str.substr(0, pos);
      v.push_back(token);
      str.erase(0, str.find(delimiter) + delimiter.length());
    }
  v.push_back(str);
  return v;
}

Так что используйте '|' в качестве разделителя, и вы получите следующий результат :)!

person MegaColorBoy    schedule 20.11.2017
comment
Однако это приведет к очень неэффективному коду. - person Lundin; 20.11.2017
comment
@Lundin Ну, если предположить, что пользователь хотел просто извлечь целые числа ... кроме этого, почему вы думаете, что это будет неэффективно? Просто любопытно. - person MegaColorBoy; 20.11.2017
comment
Вы просматриваете одну и ту же строку снова и снова. Возможно, вы измените размер вектора. Вы изменяете размер строки снова и снова. Все принудительные перераспределения кучи убьют любую производительность кэша, а также вызовут фрагментацию кучи. Результирующий машинный код будет ужасным, в тысячи раз медленнее, чем обычная программа strtok() на C. И нет, компилятор не может волшебным образом оптимизировать этот код до эквивалента на C. - person Lundin; 20.11.2017

Ну, если вам просто нужна новая строка с указанным вами выводом, вы можете сделать так же просто, как заменить разделитель (вы также можете скопировать новую строку и изменить)

#include<bits/stdc++.h>
using namespace std;

int main()
{
string str="12|34|5|100";

 for(int i=0;i<str.length();i++)
 {
  if(str[i]=='|')
    str[i]=',';
 }

    cout<<str<<endl;
    return 0;
}
person Satish Srinivas    schedule 20.11.2017
comment
Идея замены разделителя уже была охвачена другими ответами, в том числе отсутствием необходимости писать цикл. - person Steve; 20.11.2017
comment
Также это не добавляет ", " с пробелом. - person Lundin; 20.11.2017

Если вы просто используете STL, вам не нужно использовать цикл.

#include <iostream>
#include <string>
#include <algorithm>
int main() {
    std::string s = “12|34|56|78”;
    std::replace(s.begin(),s.end(),'|',',');
    std::cout << s << '\n';
    return 0;
}

Послушайте лекции Стефана Т. Лававея по STL, если у вас есть время. Они веселые! Ссылка

person anotherone    schedule 20.11.2017
comment
Это даже не скомпилируется. - person Lundin; 20.11.2017
comment
теперь будет. почему-то ТАК не обновлял мои правки. - person anotherone; 20.11.2017
comment
ОП хочет заменить "|" на ", ". Это не отвечает на вопрос. - person Lundin; 20.11.2017
comment
@Lundin Нет, ОП этого не хочет. Прочтите его/ее комментарий. - person anotherone; 20.11.2017

Взгляните на strtok. Это стандартная библиотечная функция.

Ссылаясь на источник:

char * strtok ( char * str, const char * delimiters );Последовательность вызовов этой функции разбивает строку str на токены, которые представляют собой последовательности непрерывных символов, разделенных любым символом, входящим в состав разделителей.

/* strtok example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] ="- This, a sample string.";
  char * pch;
  printf ("Splitting string \"%s\" into tokens:\n",str);
  pch = strtok (str," ,.-");
  while (pch != NULL)
  {
    printf ("%s\n",pch);
    pch = strtok (NULL, " ,.-");
  }
  return 0;
}
person yar    schedule 20.11.2017
comment
@Isuka, спасибо, только что отредактировал ответ - person yar; 20.11.2017