如何将字符串转换为字符串数组?
如何将字符串转换为字符串数组?如
string str = "abc";
转换为
string[] strs = {"a", "b", "c"}; --------------------编程问答-------------------- 要么在字符串里加点分隔符用split
要么循环for --------------------编程问答-------------------- String.ToCharArray --------------------编程问答-------------------- str.Split("",StringSplitOptions.RemoveEmptyEntries); --------------------编程问答--------------------
这个可以 --------------------编程问答--------------------
/// <summary>--------------------编程问答-------------------- --------------------编程问答--------------------
/// string转string[]
/// </summary>
/// <param name="str">待转换字符串</param>
/// <returns>字符串数组</returns>
public static string[] StrToArray(string str)
{
string[] str_array = new string[str.Length];
for (int cnt = 0; cnt < str.Length; cnt++)
{
str_array[cnt] = str[cnt];
}
return str_array;
}
这种方法能实现,还没找到更简单的. --------------------编程问答-------------------- String.Split(_) --------------------编程问答-------------------- string[] strs = Regex.Split(str, "(?<=.)(?=.)");
using System;--------------------编程问答-------------------- 这样也可以:
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
string str = "abc";
string[] strs = Regex.Split(str, "(?<=.)(?=.)");
foreach (string s in strs)
{
Console.WriteLine("[{0}]", s);
}
}
}
/* 程序输出:
[a]
[b]
[c]
*/
string[] strs = System.Text.RegularExpressions.Regex.Split(str, "(?!^|$)");--------------------编程问答--------------------
/// <summary>--------------------编程问答-------------------- ToCharArray --------------------编程问答--------------------
/// 按指定字数分割字符串
/// </summary>
/// <param name="str">待分割字符串</param>
/// <param name="number">字数</param>
/// <returns>返回分割后的字符串</returns>
public static string[] SplitByNumberWords(String str, int number)
{
string[] strSplit = null;
int length = str.Length;
if (length > number)
{
//需要分割的字符串数组长度,有余数时总长度要加一
strSplit = new string[(int)length / number + (length % number > 0 ? 1 : 0)];
for (int i = 0; i < strSplit.Length;i++ )
{
if ((i + 1) == strSplit.Length && (length % number) > 0)
{
//最后一截字符串
strSplit[i] = str.Substring(i * number, length % number);
}else
{
strSplit[i] = str.Substring(i * number, number);
}
}
}else
{
//长度小于自定字符数
strSplit = new string[1];
strSplit[0] = str;
}
return strSplit;
}
简单实用! --------------------编程问答-------------------- 楼主要的肯定是制定字数的。
也就是说“ABCDEFGH”=》A,B,C,D,E,F,G,H 或者AB,CD,EF,GH
用我的方法SplitByNumberWords("string",切割后lengs) --------------------编程问答--------------------
注意: 结果要的是 string[] , 不是char[] --------------------编程问答--------------------
这个好
--------------------编程问答--------------------
这个只有一行语句:
return Regex.Split(s, string.Format("(?<=^(?:.{{{0}}})+)", n));
using System;--------------------编程问答--------------------
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
string str = "abcdefghijklmnopqrstuvwxyz";
string[] strs = SplitByNumberWords(str, 5);
foreach (string s in strs)
{
Console.WriteLine("[{0}]", s);
}
}
static string[] SplitByNumberWords(string s, int n)
{
return Regex.Split(s, string.Format("(?<=^(?:.{{{0}}})+)", n));
}
}
/* 程序输出:
[abcde]
[fghij]
[klmno]
[pqrst]
[uvwxy]
[z]
*/
9楼的方式早就知道了,10楼这个受教了 --------------------编程问答-------------------- String.ToCharArray 确实可以 --------------------编程问答-------------------- wuyi8808 :
谢了谢了,受教了。
俺就没想到过正值,哈哈! --------------------编程问答--------------------
请看清楚题目。
注意,LZ要求返回的是 string[],而不是 char[]。
--------------------编程问答--------------------
赞 --------------------编程问答-------------------- 改进一下17楼的程序,加上“(?!$)”,以去除可能的最后一个空字符串:
static string[] SplitByNumberWords(string s, int n)--------------------编程问答-------------------- dd --------------------编程问答-------------------- 这种Google 一把一大堆的东西也是精华。。。。床上等你越来越不行了。 --------------------编程问答--------------------
{
return Regex.Split(s, string.Format("(?!$)(?<=^(?:.{{{0}}})+)", n));
}
正解。 --------------------编程问答--------------------
这还叫正解?
new string(str.ToCharArray())还差不多 --------------------编程问答--------------------
--------------------编程问答-------------------- 神奇啊!!!!!!!!!!! --------------------编程问答--------------------
string s = "abcdefghijklmwwsa2321rw@1124^&*";
int n = s.Length ;
for (int i = 0; i < n; i++)
{
s=s.Insert(2*i+1, ",");
}
s = s.Remove(s.Length - 1);//去掉最后一个","号
string[] res = s.Split(',');
大哥们,你们就不能先看看书,先看看语法说明?就跑来正解误解的。 --------------------编程问答-------------------- jf --------------------编程问答--------------------
你们都是觉得写得短和难读才算牛吗?
这个问题本来就将char[]数组简单地用 new string(char, int) 转化为string[]就OK了,还加精。真是无语。。。
--------------------编程问答-------------------- 不知道啊啊啊啊 --------------------编程问答-------------------- Mark! --------------------编程问答-------------------- #include <string>
#include <iostream>
using namespace std;
int main()
{
size_t i=0,j=0;
int number=0;
string str1 ="10.7.93.25";
string str2 = ".";
string result[4];
for(;((j=str1.find(str2,i))!=string::npos);i=j)
{
result[number]=str1.substr(i,j-i);
j=j+str2.size();
++number;
}
result[number]=str1.substr(i);
cout<<result[0]<<endl;
cout<<result[1]<<endl;
cout<<result[2]<<endl;
cout<<result[3]<<endl;
return 0;
}
http://www.Lookxin.cn IT资讯网
--------------------编程问答-------------------- 感想颇多!都用了自己的方式,都有自己的特点
方式一:
String.ToCharArray
这个方式很好,而且简单明了,比较实用,但是返回值是char数组,如果使用的处理函数是string数组,需要处理或转换一下,但也不失为一种好方法
方式二:
就是自己写代码的方式,利用循环和其他的一些方式,利用自己写的逻辑进行处理。这种方式,也可以实现,而且能比较灵活的实现,而且能够随心所欲。但是如果分隔的方式不是需要太多变化的话,还是推荐使用类库,这样比较能节省大家的工作量
方式三:
使用正则表达是,这个方式很好!而且应该有很高的效率。而且逻辑简单清晰。但是就是,不是所有人都熟悉这正则表达式!但是这个方式确实很好! --------------------编程问答-------------------- String.ToCharArray
--------------------编程问答-------------------- 大学问啊。
String.ToCharArray --------------------编程问答-------------------- 这个有必要讨论吗 --------------------编程问答-------------------- 路过 --------------------编程问答-------------------- 直接套用的。。 --------------------编程问答--------------------
总结的不错
···
这个最好还是自己写个函数,毕竟模板里的函数代码效率不一定有我们自己写的单一用处的快,因为往往模板代码要考虑的十分周全,而我们只需要写自己要的就行了 --------------------编程问答-------------------- 学习 --------------------编程问答-------------------- 用Split()就可以了 --------------------编程问答-------------------- String.ToCharArray 可以
split也行 --------------------编程问答-------------------- String.ToCharArray 可以
split也行
呵呵,试试 --------------------编程问答--------------------
String str="abc";
String s[]=new String[str.length()];
for(int i=0;i<str.length();i++){
s[i]=""+str.charAt(i);
System.out.println(s[i]);
}
虽然方法不算好,还比较简便 --------------------编程问答-------------------- 顶顶顶顶顶顶顶顶顶顶。 --------------------编程问答-------------------- 学习了,的确不错。
一般都用指针++吧 --------------------编程问答-------------------- 方法真是 多多。。。。。。。。。。。。。。。。 --------------------编程问答-------------------- String.Split(_) OR FOR(){} --------------------编程问答-------------------- 不错,挺好的啊
String str="abc";
String s[]=new String[str.length()];
for(int i=0;i<str.length();i++){
s[i]=""+str.charAt(i);
System.out.println(s[i]);
}
--------------------编程问答--------------------
真是无语,new string(char, int) 能转化为 string[] 吗?
new string(...) 是 string 的构造函数,得到的只能是 string,不可能是 string[]。
--------------------编程问答--------------------
ok,我说得不够清楚。
我说的是用string的构造方法将char转为string,这中间需要一个循环,比如for,将每一个char进行一次转换最后得到一个string[]数组,这会多出来几行代码,但是效率和可读性绝对是强壮的。
这些都是细枝末节了,需要一定说得那么清楚吗?我只是想说这么简单的问题,大家不要写得那么晦涩,而且还加精,这样只会带来一些不好的风气,实事上CSDN上现在很多帖子都是这样子。技巧要用在它真正需要存在的地方,那才叫做技巧。
--------------------编程问答-------------------- 顶起来……,学习了顶起来……,学习了顶起来……,学习了顶起来……,学习了 --------------------编程问答-------------------- 方法多种多样啊
留个记号了 --------------------编程问答-------------------- --------------------编程问答-------------------- 哈哈。学习了,谢谢楼主了 --------------------编程问答-------------------- 呵呵,我就打得快一点,言语上没有说清楚,但是我相信这种细技末节的代码没有几人不会的吧?这不是我说的重点。
我想说的重点是不要宣传这种卖弄技巧的风气。程序还是应该追求可读性,强壮性和效率。 --------------------编程问答--------------------
难道下面这行语句的效率和可读性不是强壮的?真正学懂正则的程序员理解"(?!^|$)"有困难吗?
--------------------编程问答-------------------- 这个问题本来就将char[]数组简单地用 new string(char, int) 转化为string[]就OK了
----
其实说实话,这句话我也觉得没什么不妥的,只是没说细节,但是实现重点说了。难道非得把一个For或者把一个Select(Linq)写出来大家才能看懂吗? --------------------编程问答--------------------
严重同意!
但"(?!^|$)"没有“可读性,强壮性和效率”?
请学过正则的程序员投票吧! --------------------编程问答-------------------- String.toCharArray() --------------------编程问答--------------------
while (*t++ = *s++);
请问上面这行代码有没有“可读性,强壮性和效率”? --------------------编程问答--------------------
而且效率最高 --------------------编程问答--------------------
先不论正则的效率,就是单这个?!^|$,你觉得每个人都有你这么厉害吗哈哈。为什么不System.Text.RegularExpressions.Regex.Split(str,"");呢,为什么这里要排除掉“开始”和“结束”呢。你真的打从心底认为这个可读性很强?? --------------------编程问答--------------------
哪个效率最高必须有测试数据的支持才行,不是口头上说说就行的。 --------------------编程问答-------------------- 真正学懂正则的程序员会不知道(?!)的用法? --------------------编程问答--------------------
到目前的楼层为止,我还没有看到一个完整而正确的 String.ToCharArray 版的程序。
请先动手写出程序来(当然,这个程序非常容易写,但我就还没看到谁动手写得正确的),然后,才能写程序比较各种方法的效率。
没有实际的程序就,就先别奢谈效率最高了。 --------------------编程问答--------------------
System.Text.RegularExpressions.Regex.Split(str,"");
相比较于
System.Text.RegularExpressions.Regex.Split(str,"(?!^|$)");
会将头尾的的空字符串分配进去。
而?!^|$(实际上应该是?<!^|?!$更好理解)将这种情况排除在外。
我要表达的意思也说完了,该解释的也解释完了,可能我们对这个问题认识的尺度不一样,那么OK,仁者见仁,智者见智。 --------------------编程问答-------------------- 既然没有人愿意动手写 String.ToCharArray 版的程序,那就我写一个吧:
(大家还有改进意见吗?)
using System;--------------------编程问答-------------------- mark --------------------编程问答-------------------- mark --------------------编程问答--------------------
class Program
{
static void Main()
{
string str = "abc";
string[] strs = Split(str);
foreach (string s in strs)
{
Console.WriteLine("[{0}]", s);
}
}
static string[] Split(string s)
{
char[] c = s.ToCharArray();
string[] strs = new string[c.Length];
for (int i = 0; i < c.Length; i++)
{
strs[i] = new string(c[i], 1);
}
return strs;
}
}
/*--------------------编程问答-------------------- 说到 String.ToCharArray 版的程序(参见71楼,或者还有哪位愿意写个更好的程序?)
这里需要澄清一下,
"(?!^|$)" 已经很好理解了,
如果非要分开写的话,应该是: "(?!^)(?!$)",
而不是:"(?<!^)|(?!$)"。
首先,(?<!^) 没道理,这里不应该用逆序环视的,
其次,逻辑上也不是“或”的关系,不应该用“|”。
无论是 "(?<!^)|(?!$)",还是 "(?!^)|(?!$)",
都不会得到正确的结果。
*/
我想了一下,完全没有必要用 String.ToCharArray,直接用 s[i] 就很好了,
何必 String.ToCharArray 多此一举呢?
(请各位程序员发表高见)
--------------------编程问答-------------------- 综上所述,就我看来,String.ToCharArray 完全是多此一举,根据75楼的程序,压根儿就没有必要用 String.ToCharArray,那些说 String.ToCharArray 正解的程序员是不是应该多思考一下呢? --------------------编程问答--------------------
static string[] Split(string s)
{
string[] strs = new string[s.Length];
for (int i = 0; i < s.Length; i++)
{
strs[i] = new string(s[i], 1);
}
return strs;
}
}
谢谢更正,刚才我是随手打的,没有测试,我想说的是应该用 (?<!^)(?!$) 更好理解,含义为 前面不为“开始”,后面不为”结束“ --------------------编程问答--------------------
String.ToCharArray应该比直接引用string的索引器要快,当然这只是我一直以来对string[]这个索引器的印象,并没有做过深入测试,所以我前面才会提到ToCharArray而不是string[]索引器。 --------------------编程问答-------------------- (?!^)(?!$) 也是可以的,意思是:“不是行首,也不是行末”
(?!^|$) 的意思是:“不是行首或行末”,很容易理解的。
--------------------编程问答-------------------- char[] c = s.ToCharArray();
多声明了一个 char[],需要申请空间,应该比直接用 s[i] 慢,这是我的感觉,未经测试。 --------------------编程问答-------------------- DDDDDDDDDDDDDDDDDDDDDDDD --------------------编程问答--------------------
1. 首先你用“行首”,“行末”的术语比我用的“开始”“结束”好听点,哈哈。
2. ?!或?= 带有“向后断言”的意思,?<!和?<=带有“往前断言”的意思,我是从这个角度出发才认为(?<!^)(?!$)更好理解
最后想说一点是,版主貌似比我还认真执着哈哈,程序员都这样~~
不过说到后面就已经是跑题了
--------------------编程问答-------------------- 当然,71楼的程序仅仅是我写的 String.ToCharArray 版的程序,个人之见,不能代表 String.ToCharArray 派程序员的真正水平和效率。
我所以写71楼的和程序,是因为我看到各位程序员大谈 String.ToCharArray,而没有人愿意写出一个可以正确解答 LZ 总是的 String.ToCharArray 版的程序,随手就写了一个。
如果各位程序员对 String.ToCharArray 有更深刻的理解,写出更好的 String.ToCharArray 版的程序,非常欢迎贴出来讨论。 --------------------编程问答-------------------- 吃饭去了,回头再来看贴。 --------------------编程问答-------------------- 没看见linq的,补个linq的:
static string[] Fun(string str)见笑了 --------------------编程问答-------------------- 写得好。1. 首先你用“行首”,“行末”的术语比我用的“开始”“结束”好听点,哈哈。
{
return (from c in str select c.ToString()).ToArray();
}
2. ?!或?= 带有“向后断言”的意思,? <!和? <=带有“往前断言”的意思,我是从这个角度出发才认为(? <!^)(?!$)更好理解
最后想说一点是,版主貌似比我还认真执着哈哈,程序员都这样~~
不过说到后面就已经是跑题了 --------------------编程问答-------------------- 这种问题永远都是回复数最高,高手也最爱回复的问题! --------------------编程问答-------------------- 测试代码:
class Program
{
static void Main(string[] args)
{
Random random = new Random();
int count = 10000000;
char[] chars = new char[count];
for (int i = 0; i < chars.Length; i++)
{
chars[i] = (char)random.Next(65, 91);
}
string s = new string(chars);
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
Split_Regex(s);
stopwatch.Stop();
Console.WriteLine("Split_Regex: {0:N0}", stopwatch.ElapsedTicks);
stopwatch.Reset();
stopwatch.Start();
Split_StringIndexer(s);
stopwatch.Stop();
Console.WriteLine("Split_StringIndexer: {0:N0}", stopwatch.ElapsedTicks);
stopwatch.Reset();
stopwatch.Start();
Split_ToCharArray(s);
stopwatch.Stop();
Console.WriteLine("Split_ToCharArray: {0:N0}", stopwatch.ElapsedTicks);
stopwatch.Reset();
stopwatch.Start();
Split_Linq(s);
stopwatch.Stop();
Console.WriteLine("Split_Linq: {0:N0}", stopwatch.ElapsedTicks);
Console.ReadKey();
}
static Regex _regex = new Regex("(?!^|$)", RegexOptions.Compiled);
static string[] Split_Regex(string s)
{
return _regex.Split(s);
}
static string[] Split_StringIndexer(string s)
{
string[] strs = new string[s.Length];
for (int i = 0; i < s.Length; i++)
{
strs[i] = new string(s[i], 1);
}
return strs;
}
static string[] Split_ToCharArray(string s)
{
char[] chars = s.ToCharArray();
string[] strs = new string[s.Length];
for (int i = 0; i < s.Length; i++)
{
strs[i] = new string(chars[i], 1);
}
return strs;
}
static string[] Split_Linq(string s)
{
return (from c in s select c.ToString()).ToArray();
}
}
测试结果:
Split_Regex: 191,903,432
Split_StringIndexer: 48,318,578
Split_ToCharArray: 43,770,727
Split_Linq: 62,211,450
ToCharArray方法和StringIndexer方法的性能接近,Linq方法次之,Regex方法速度明显落后。
而且,我始终认为,Regex 方法的可读性是最差的!
--------------------编程问答-------------------- 排版不好,重新发一遍:
Split_Regex: 191,903,432
Split_StringIndexer: 48,318,578
Split_ToCharArray: 43,770,727
Split_Linq: 62,211,450 --------------------编程问答-------------------- 。。。。。。
换行怎么没了?!
Split_Regex: 191,903,432
Split_StringIndexer: 48,318,578
Split_ToCharArray: 43,770,727
Split_Linq: 62,211,450 --------------------编程问答-------------------- 目前测试此方法最快:
static string[] Fun3(string str)--------------------编程问答-------------------- Sorry,ToCharArray方法应该更正一下,更正后速度能够再快一些,速度会稍微明显地优于String索引器方法(因为编译器的优化)。
{
int length = str.Length;
string[] result = new string[length];
for(int index = 0;index < length;index++)
{
result[index] = str[index].ToString();
index++;
}
return result;
}
static string[] Split_ToCharArray(string s)--------------------编程问答--------------------
{
char[] chars = s.ToCharArray();
string[] strs = new string[s.Length];
for (int i = 0; i < chars.Length; i++)
{
strs[i] = new string(chars[i], 1);
}
return strs;
}
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Runtime.Serialization.Formatters.Binary;
using System.Threading;
using System.Windows.Forms;
using System.Drawing;
namespace Test
{
static class Program
{
static void Main()
{
Random random = new Random();
int count = 10000000;
char[] chars = new char[count];
for(int i = 0;i < chars.Length;i++)
{
chars[i] = (char)random.Next(65, 91);
}
string s = new string(chars);
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
Fun1(s);
stopwatch.Stop();
Console.WriteLine("Fun1: {0:N0}", stopwatch.ElapsedTicks);
stopwatch.Reset();
stopwatch.Start();
Fun2(s);
stopwatch.Stop();
Console.WriteLine("Fun2: {0:N0}", stopwatch.ElapsedTicks);
stopwatch.Reset();
stopwatch.Start();
Fun3(s);
stopwatch.Stop();
Console.WriteLine("Fun3: {0:N0}", stopwatch.ElapsedTicks);
stopwatch.Reset();
stopwatch.Start();
Fun4(s);
stopwatch.Stop();
Console.WriteLine("Fun4: {0:N0}", stopwatch.ElapsedTicks);
stopwatch.Reset();
stopwatch.Start();
Split_ToCharArray(s);
stopwatch.Stop();
Console.WriteLine("Split_ToCharArray: {0:N0}", stopwatch.ElapsedTicks);
Console.ReadKey();
}
static string[] Fun1(string str)
{
return (from c in str select c.ToString()).ToArray();
}
static string[] Fun2(string str)
{
return (from c in str select new string(c, 1)).ToArray();
}
static string[] Fun3(string str)
{
int length = str.Length;
string[] result = new string[length];
for(int index = 0;index < length;index++)
{
result[index] = str[index].ToString();
index++;
}
return result;
}
static string[] Fun4(string str)
{
int length = str.Length;
string[] result = new string[length];
for(int index = 0;index < length;index++)
{
result[index] = new string(str[index], 1);
index++;
}
return result;
}
static string[] Split_ToCharArray(string s)
{
char[] chars = s.ToCharArray();
string[] strs = new string[s.Length];
for(int i = 0;i < chars.Length;i++)
{
strs[i] = new string(chars[i], 1);
}
return strs;
}
}
}
Fun1: 6,735,521,718
Fun2: 7,073,163,153
Fun3: 2,774,066,976
Fun4: 2,969,522,136
Split_ToCharArray: 5,301,748,944
--------------------编程问答--------------------
你再.ToString()撒...简单实用额... --------------------编程问答--------------------
这两个方法都有问题,循环体内的 index++; 应该去掉。
--------------------编程问答-------------------- 你的Fun3和Fun4有问题 --------------------编程问答-------------------- 请指教 --------------------编程问答-------------------- 发现了,多敲了个index++。自己太粗心了。谢谢! --------------------编程问答-------------------- 我运行了88楼的测试程序,发现确实是 Regex 版本最慢。
但 Split_StringIndexer 和 Split_ToCharArray 这两个版本的运行速度似乎和运行的先后次序有很大的关系,不知是为什么。
测试例子随后贴出。 --------------------编程问答--------------------
using System;
using System.Diagnostics;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
Random random = new Random();
int count = 100000;
char[] chars = new char[count];
for (int i = 0; i < chars.Length; i++)
{
chars[i] = (char)random.Next(65, 91);
}
string s = new string(chars);
Stopwatch stopwatch = new Stopwatch();
stopwatch.Reset();
stopwatch.Start();
Split_StringIndexer(s);
stopwatch.Stop();
Console.WriteLine("Split_StringIndexer: {0,20:N0}", stopwatch.ElapsedTicks);
stopwatch.Reset();
stopwatch.Start();
Split_ToCharArray(s);
stopwatch.Stop();
Console.WriteLine(" Split_ToCharArray: {0,20:N0}", stopwatch.ElapsedTicks);
}
static string[] Split_StringIndexer(string s)
{
string[] strs = new string[s.Length];
for (int i = 0; i < s.Length; i++)
{
strs[i] = new string(s[i], 1);
}
return strs;
}
static string[] Split_ToCharArray(string s)
{
char[] chars = s.ToCharArray();
string[] strs = new string[s.Length];
for (int i = 0; i < s.Length; i++)
{
strs[i] = new string(chars[i], 1);
}
return strs;
}
}
/* 在我的机器上的某次运行结果:
Split_StringIndexer: 10,970,659
Split_ToCharArray: 31,380,433
*/
补充:.NET技术 , C#