Я пытаюсь преобразовать строку, например, "как дела?". в массив без какого-либо запятой или любую пунктуацию, которая похожа на {'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]);
}
Во-первых, некоторые заметки о вашем коде:
<cstring>
(т.е. <string.h>
) бесполезен, так как вы не используете ничего из заголовка <cstring>
в своем коде.
Поскольку string
является входным параметром только для чтения, вы можете передать его командой const &
.
Поскольку вам нужен массив символов, вы можете либо вернуть 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
);
Еще одно простое решение:
Я изменяю тип возвращаемого значения на строку, если вы настаиваете на том, что вы можете взять значение 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;
Вы также можете использовать простую итерацию с помощью 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'
Вы изобретаете колесо
std::string
имеет методы, которые помогут вам
например
size_t found = str.find_last_of(".");
str.replace(found,1," ");
copy_if
.