我正在尝试转换字符串,例如,“你好吗?”进入一个没有任何逗号空格或任何标点符号的数组,就像{'h','o','w','a','r','e','y','o','u' , 'd', '0', '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]);
}
答案 0 :(得分:1)
首先,您的代码有一些注释:
<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' }
如果您喜欢更多&#34;功能&#34; 样式,可以使用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
);
答案 1 :(得分:0)
你正在重新发明轮子
std::string
有methods to help you
例如
size_t found = str.find_last_of(".");
str.replace(found,1," ");
答案 2 :(得分: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'
答案 3 :(得分:0)
另一个简单的解决方案:
我将返回类型更改为字符串,如果您坚持认为可以将c_str()
的返回值更改为const char*
字符串已经像字符向量。
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;