Как разбить строку на массив символов в C ++?

0

Я пытаюсь преобразовать строку, например, "как дела?". в массив без какого-либо запятой или любую пунктуацию, которая похожа на {'h', 'o', 'w', 'a', 'r', 'e', 'y', 'o', 'u', 'd', 'o', 'i', 'n', 'g'} Это функция, которую я написал ниже, но она не работает.

#include <iostream>
#include <cstring>
#include <string>
char split(string str){
        char array[80];
        for (int i=0; i<str.length();i++){
                if (str[i]==","||str[i]=="."||str[i]==" ")
                        delete str[i];
                else
                        array[i]=str.substr(i,1);
        }
        return (array[80]);
}
  • 1
    Расширить на "не работает".
  • 4
    Строка уже является массивом символов.
Показать ещё 7 комментариев
Теги:
string
arrays

4 ответа

1
Лучший ответ

Во-первых, некоторые заметки о вашем коде:

  1. <cstring> (т.е. <string.h>) бесполезен, так как вы не используете ничего из заголовка <cstring> в своем коде.

  2. Поскольку string является входным параметром только для чтения, вы можете передать его командой const &.

  3. Поскольку вам нужен массив символов, вы можете либо вернуть vector<char> (или даже string...).

Чтобы решить вашу проблему, вы можете просто перебирать символы входной строки, и если они являются алфавитными и числовыми символами (т.е. Без пробелов, без запятой и т.д.), Вы можете добавить их к выходному результирующему вектору символов.

Возможно, вы захотите рассмотреть следующий прокомментированный код:

#include <ctype.h>      // For isalnum()
#include <iostream>     // For console output
#include <string>       // For std::string
#include <vector>       // For std::vector
using namespace std;

vector<char> split(const string& str)
{
    vector<char> result;

    // For each character in the string
    for (char ch : str)
    {
        // Copy only alphabetical characters and numeric digits
        if (isalnum(ch))
        {
            result.push_back(ch);
        }
    }

    return result;
}

int main()
{
    vector<char> result = split("How are you doing?");
    cout << "{ ";
    for (char ch : result)
    {
        cout << "'" << ch << "' "; 
    }
    cout << "}" << endl;
}

Вывод:

{ 'H' 'o' 'w' 'a' 'r' 'e' 'y' 'o' 'u' 'd' 'o' 'i' 'n' 'g' }

Если вам нравится более "функциональный" стиль, вы можете использовать алгоритм std::copy_if(), используя следующий код:

#include <algorithm> // For std::copy_if()
#include <iterator>  // For std::back_inserter

....
const string str = "How are you doing?";
vector<char> result;
copy_if(
    str.begin(), str.end(),                // copy source
    back_inserter(result),                 // copy destination
    [](char ch) { return isalnum(ch); }    // when to copy the character
);
  • 0
    Спасибо вам большое! Это очень полезно, но проблема в том, что я еще не продвинулся так далеко в своем классе. Я думаю, что преподаватель моего класса позволяет нам использовать только <string> <iostream> и некоторые простые библиотеки. Но я обязательно напишу это для моего будущего исследования!
  • 0
    Я рад, что это помогло.
0

Еще одно простое решение:

Я изменяю тип возвращаемого значения на строку, если вы настаиваете на том, что вы можете взять значение c_str() возвращаемого значения в const char*

string уже как вектор символов.

string split(string str)
{
    size_t i=0;
    while (string::npos != (i=str.find_first_of(",. ",i))){
        str.erase(i,1);
    }
    return str;
}

Вы используете его следующим образом:

string s = split("bla bla bla");

если вы хотите указатель:

cout<<s.c_str()<<endl;
0

Вы также можете использовать простую итерацию с помощью char* чтобы пройти через строку и выбрать то, что вам нужно.

Я не уверен, что причина для возвращения array[80] FRM split, но это не имеет отношения к вашему вопросу.

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

char split(std::string str)
{
   char array[80];
   char const* cp = str.c_str();
   int i = 0;
   for (; *cp; ++cp )
   {
      if ( isalnum(*cp) )
      {
         array[i++] = *cp;
      }
   }
   array[i] = '\0';

   cp = array;
   for (; *cp; ++cp )
   {
      std::cout << "'" << *cp << "' ";
   }
   std::cout << std::endl;

   return (array[80]);
}

int main()
{
   split("What are you having for lunch today?");
}

Вывод:

'W' 'h' 'a' 't' 'a' 'r' 'e' 'y' 'o' 'u' 'h' 'a' 'v' 'i' 'n' 'g' 'f' 'o' 'r' 'l' 'u' 'n' 'c' 'h' 't' 'o' 'd' 'a' 'y'
0

Вы изобретаете колесо

std::string имеет методы, которые помогут вам

например

size_t found = str.find_last_of(".");
str.replace(found,1," ");
  • 4
    Больше похоже на простой copy_if .
  • 0
    Да, copy_if не за горами: D

Ещё вопросы

Сообщество Overcoder
Наверх
Меню