将字符串拆分为字符数组

21

我正在编写一个需要输入字符串,并将其分解为单个字母的程序。本质上,我需要找到一种将“string”变成["s","t","r","i","n","g"]的方法。这些字符串也是使用字符串数据类型存储的,而不是默认的字符数组。我希望保持这种方式并避免使用char,但如果必要,我会使用它。


在分割后,您需要对字母进行其他处理吗?也就是说,您需要将这些字母放入某种数据结构中,而不是string吗? - Potatoswatter
这是一个愚蠢的问题,字符串是字符数组。 - Ian
谢谢你的问题,答案帮了我很多。我知道这很显然,但我卡住了。 - skill347
7个回答

33

假设您已经有了输入的字符串:

string s("string");
vector<char> v(s.begin(), s.end());

这将使用一个字符串中的字符填充向量v


2
我见过的最好的解决方案!非常感谢。 - Fomentia

26
string a = "hello"; 
cout << a[1];

我希望这样解释可以说明问题。


我不想这样做,因为我在这里不是来给教程,只是回答问题。 - Luca Matteis
3
记录一下,你也可以这样做:cout << "hello"[1]; - AshleysBrain
2
@AshleysBrain:或者 cout << 1["hello"]; - Yakov Galka

1

字符串只是底层字符的序列(即std::string的char和std::wstring的wchar_t)。

因此,您可以轻松获取每个字母:

for (std::string::size_type l = 0; l < str.length(); ++l)
{
    std::string::value_type c = str[l];
}

6
你会用那些术语吓到他的。我认为使用“int”,甚至更好的是“size_t”,这在所有现有的平台上都可以工作,并且更加清晰明了。 - Andreas Bonini

1
尝试使用std::stringc_str()方法:
#include <string>
using namespace std;

int main(void)
{
  string text = "hello";
  size_t length = text.length() + sizeof('\0');
  char * letters = new char[length];
  strcpy(letters, length.c_str());
  for (unsigned int i = 0; i < length; ++i)
  {
      cout << '[' << i << "] == '" << letters[i] << "'\n";
  }
  return EXIT_SUCCESS;
}

不需要将 sizeof('\0') 添加到长度中,因为它可能大于1,然后分配的数组将具有比所需更高的大小。相比之下,添加 1 要比 sizeof('\0') 更好。 - George
1
乔治,sizeof(char)始终为1。 - paxdiablo
不是这样的!sizeof(char)并不总是等于1。我曾经使用过一种DSP芯片,其中所有东西都至少是32位,包括char、short和int——sizeof(char)==sizeof(short)==sizeof(int)。C标准只是说sizeof(char)<=sizeof(short)<=sizeof(int),但并不要求sizeof(char)==1。其中一个副作用是,将char和BYTE强制转换为限制值为8位的数据类型没有任何效果,因为数据类型本来就是32位。尽管这是一种不寻常的架构,但C标准绝对没有说sizeof(char)==1。 - Ryan
1
不,@Ryan,很抱歉但你错了。5.3.3节“Sizeof”指出:“sizeof(char),sizeof(signed char)和sizeof(unsigned char)都是1”。Char是一个字节,但不一定是八位字节。这与C语言相同。这来自于C++0x的n3000草案,但它已经存在很长时间了。 - paxdiablo
啊,我改正了。我的真正观点是不要假设1等于8位,这一点你已经明确说明了。有趣的是,DSP芯片的特点是1 == sizeof(char) == sizeof(short) == sizeof(int),当我发现这一点时,我感到惊讶,其中1等于32位。 - Ryan
是的,Ryan,那曾经让我吃过苦头。我以为在 ISO C 标准中发现了一个不一致之处,因为他们谈到 char 可以超过 8 位,但 sizeof 返回字节数(但 char 仍然是一个字节)。结果 ISO 也重新定义了字节(这很有意义,所有其他标准,如通信标准,都使用八位值的八进制)。 - paxdiablo

0
你可以使用for循环来遍历字符串中的字符。
    std::string str = "word"
    for(char i : str){
        std::cout << i << std::endl;
    }

0
如果你想将分割的字符串转换为字符,首先遍历字符串,并将每个字符写入到字符数组的第i个位置,即:
  char array[1000];
   std::string input="i dont think love never ends";
   for(size_t i=0;i<=input.length();/*or string::npos;*/i++)
    {
        if (input[i] != '\0')
        {
        array[i] = input[i];
        }
    else
        {
        break;
        }
    }
    //to avoid noise after position input.length();
        for (size_t i = input.length(); i <= 1000; i++)
        {
             array[i] = '\0';
        }
      //ie return array; or print
    for (size_t i = 0; i < 100; i++)
    {
    std::cout << array[i] << std::endl;
    }

0
string input ="some string for example my cat is handsome";
vector<string> split_char_to_vector(string input) {
  vector<string> output;
  for(size_t i=0;i<=input.length();i++) {
    output.push_back(input[i]));
  }
  return output;
}

如果你想将分割的字符串转换为字符,首先遍历字符串,并将每个字符写入到字符数组的第i个位置,即:
 char array[1000];
std::string input="i dont think love never ends";
 for(size_t i=0;i<=input.length();/*or string::npos;*/i++)
  {
            if (input[i] != '\0')
        {
            array[i] = input[i];
        }
        else
        {
            break;
        }
    }
    for (size_t i = 0; i < 100; i++)
    {
        std::cout << array[i] << std::endl;
    }

2
请添加细节以使答案易于理解。 - Jaydeep
1
欢迎来到Stack Overflow!虽然这段代码可能回答了问题,但最好还是加入一些上下文,解释它的工作原理以及何时使用它。仅有代码的答案在长期内往往不太有用。请参阅如何撰写良好的答案?获取更多信息。 - Mark Ormesher

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接