Массивы C++ и strstrok

Я работаю с массивами на C++. Итак, мой вход в массив - O3B4F2, и я хочу, чтобы на выходе было ОООBBBBFF? .. Я читаю о функции strtrok, но не понимаю, что это действительно хорошо, потому что она разделяет предложения на токены.

#include <iostream>
#include <string.h>
#include<stdlib.h>
using namespace std;
int main ()
{
  char a[100+1];
  cin>>a;
  char * pch;
  char dioba[] = "0 1 2 3 4 5  6 7 8 9 ";
  pch = strtok (a,dioba);
  int c;
  for(int i=0;i<strlen(a);i++)
  {
      if (isdigit(a[i])==1)
      {

      }
  }
  while (pch != NULL)
  {
    cout<<pch<<endl;
    pch = strtok (NULL,dioba);
  }

  return 0;
}

Также я пытаюсь решить аналогичную задачу, где мне нужно разделить массив на наборы букв. Мне нужен вывод идти, и я хочу, чтобы мой вывод выглядел как должен идти. Поэтому после буквы e и o я хочу использовать пробел или новую строку.

 #include <iostream>
    #include <iostream>
    #include <string.h>
    #include<stdlib.h>
    using namespace std;
    int main ()
    {
      char a[100+1];
      cin>>a;
      char b[100+1];
      int  i=0,j=0;
      for(i;i<strlen(a);i++)
       {
        if (a[i]=='a'||a[i]=='e'|| a[i]=='i')
            for(j;j<strlen(a);j++)
            {
                b[j]=' ';
            }
          b[j]= a[i];
         cout<<b<<endl;
       }
      return 0;
     }

Вы можете использовать обход input char [] по индексу или по указателю, не нужно использовать strtok. Что касается сопоставления цифровых символов с числами, общий трюк заключается в использовании c - '0' для получения цифрового значения.

Botje 22.11.2018 09:09

Re: if (isdigit(a[i])==1) - не пойдет. Прочтите документация для std::is digit.

Pete Becker 22.11.2018 15:52
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
129
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

В вашем первом случае, как упоминалось в комментариях, нет необходимости использовать strtok. Вот пример кода (хотя есть много способов выполнить запрошенную задачу):

#include <iostream>
#include <string>
#include <sstream>

int main ()
{
  std::string s;
  std::cin >> s;
  std::istringstream stream(s);

  char pch;

  // fetch stream for the character to repeat until the end of the string
  while( stream >> pch )
  {
      char nbChars;
      // fetch length for repetition
      stream >> nbChars;
      // convert character to its integer value
      nbChars -= '0';
      // repeat character as many times as needed
      for(int i=0; i < nbChars;i++)
      {
          std::cout << pch;
      }
  }

  return 0;
}

Для вашей второй задачи я предлагаю этот образец кода, вы можете изменять буквы по мере необходимости.

#include <iostream>
#include <string>

int main ()
{
  std::string s;
  std::string needSpaceChars{"aeo"};

  // read content on standard input
  std::getline(std::cin, s);
  // for each char, check its value and add space after the letters defined in needSpaceChars variable
  for(char pch: s)
  {
      // display character first
      std::cout << pch;
      // add space if character is in the list of characters to handle
      if ( needSpaceChars.find(pch) != std::string::npos )
      {
          std::cout << ' ';
      }
  }

  return 0;
}

Как вы описали проблему, ввод всегда будет в виде char, за которым следует int. Следовательно, вы должны выбрать пару (char, int) и распечатать ее согласно правилу.

for(size_t i = 0; i < arr.size() - 1;) {
    int val = (int)arr[i+1] - 48;
    for(auto j = 0; i < val; j++) {
        cout << arr[i];
    }
    i += 2;
}
  1. Первый for() предназначен для прохождения всего arr.
  2. Второй for() предназначен для печати конкретного char по количеству вхождений.

Примечание. Поскольку данный arr относится к типу char, вам необходимо преобразовать второй элемент пары из char в int.

Другие вопросы по теме