如何在C ++中将字符串拆分为字符数组?

时间:2014-03-20 22:14:44

标签: c++ arrays string

我正在尝试转换字符串,例如,“你好吗?”进入一个没有任何逗号空格或任何标点符号的数组,就像{'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]);
}

4 个答案:

答案 0 :(得分:1)

首先,您的代码有一些注释:

  1. <cstring>(即<string.h>)没用,因为您不会在代码中使用<cstring>标题中的任何内容。

  2. 由于string是输入只读参数,因此您可以将其传递给const &

  3. 由于您需要一组字符,因此您可以返回vector<char>(甚至是string ...)。

  4. 要解决您的问题,您可以简单地遍历输入字符串的字符,如果它们是字母和数字字符(即没有空格,没有逗号等),您可以将它们添加到输出结果向量中字符。

    您可能需要考虑以下示例注释代码:

    #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::stringmethods 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;