关于C#二维char[,]数组输出、打印的问题

七羽Y 2019-07-25 10:46:18
本人菜鸟一枚,最近遇到C#问题,望各位大神指教,不胜感激!

char[,] StrArr=new char[8,30];//定义了一个二维char数组
//此处对二维数组StrArr赋值,相当于8个字符串(每个字符串最多30字节,以'\0'结尾的字符串)
然后想要分别把这8个字符串,放在:label1-label8上显示,有什么好的方法吗?
...全文
1515 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
Lonerㅤㅤ 2019-07-27
  • 打赏
  • 举报
回复
虽然现在看不懂,但是大佬好多啊
逍遥派指环 2019-07-27
  • 打赏
  • 举报
回复
点赞啊~~~~~~
七羽Y 2019-07-26
  • 打赏
  • 举报
回复
嗯嗯好的,谢谢,问题已解决,就此结帖!
wanghui0380 2019-07-26
  • 打赏
  • 举报
回复
至于你要求的'\0'结束 只需修改最后一句Console.WriteLine(new string(buffer.TakeWhile(p=>!p.Equals('\0')).ToArray())); 基本这种要求,可以看成和C++的合作的产物,只有C++的人才直着与多维数组和纠结与\0jie's
七羽Y 2019-07-26
  • 打赏
  • 举报
回复
感谢大家的回复,本来想看一下二维数组转一维数组有没有什么简单的方法,或者直接显示,看来不行,直接使用for把二维数组数据依次赋值给一维数组吧,谢谢大家
wanghui0380 2019-07-26
  • 打赏
  • 举报
回复
弄清楚上面这个,东西就好写了

  char[,] Val = new char[, ] { { 'a', 'b' ,}, { 'c', 'd', }, { 'e', 'f', }, { 'g', 'h' } };


            foreach (var i in Enumerable.Range(0,Val.GetLength(0)))
            {
                char[] buffer=new char[Val.GetLength(1)];
                Buffer.BlockCopy(Val, i* Val.GetLength(1) * sizeof(char), buffer, 0, Val.GetLength(1) * sizeof(char));
                Console.WriteLine(new string(buffer));
            }
wanghui0380 2019-07-26
  • 打赏
  • 举报
回复
至于你问的,能否先转一维,我们说可以,不过只能借助字节拷贝(因为不管表现成啥,内存里都是字节,字节才是最原始的东西,char不是)
     char[,] Val = new char[, ] { { 'a', 'b' ,}, { 'c', 'd', }, { 'e', 'f', }, { 'g', 'h' } };

            char[] _buffer=new char[Val.GetLength(0) * Val.GetLength(1)];  //虽然规定的8个
            Buffer.BlockCopy(Val, 0, _buffer, 0, _buffer.Length *sizeof(char)); //但是下面的直接copy 16个字节过去
wanghui0380 2019-07-26
  • 打赏
  • 举报
回复
arr[][] 比arr[,]方便,因为前面是嵌套,方便遍历,后面那个只能用索引访问

     char[][] StrArr = new char[][]{ new char[] {'a', 'b' }, new char[] { 'c', 'd' }, new char[] { 'e', 'f' }, new char[] { 'g', 'h' } };

            foreach (var c in StrArr)
            {
                Console.WriteLine(new string(c));
            }
七羽Y 2019-07-25
  • 打赏
  • 举报
回复
引用 7 楼 LvBao_117 的回复:
你换一种数组把

char[][] strArr = new char[2][];
strArr[0]=new char[]{ 'a','b','c'};
strArr[1]=new char[]{ 'd','e','f' };

//复制到一个新的一维数组
char[] newChar = strArr[0];

//char数组转为string
string str = new string(strArr[0]);


交错数组试过了,因为要从动态库里传出,交错数组不支持封送处理,故只能使用二维数组了
LvBao_117 2019-07-25
  • 打赏
  • 举报
回复
你换一种数组把

char[][] strArr = new char[2][];
strArr[0]=new char[]{ 'a','b','c'};
strArr[1]=new char[]{ 'd','e','f' };

//复制到一个新的一维数组
char[] newChar = strArr[0];

//char数组转为string
string str = new string(strArr[0]);

RunnerDNA 2019-07-25
  • 打赏
  • 举报
回复
换成string类型的一维
string[] strArr = new string[4] { "ab", "cd", "ef", "gh" };
m0_37646670 2019-07-25
  • 打赏
  • 举报
回复
研究下矩阵的乘法
七羽Y 2019-07-25
  • 打赏
  • 举报
回复
另外,把二维数组的第一行复制到一个一维数组里面,有什么快捷方法吗?比如内存拷贝函数什么的,刚刚试了Array.Copy函数不行
七羽Y 2019-07-25
  • 打赏
  • 举报
回复
引用 2 楼 又青 的回复:
简单写了下,wpf界面展示:
private void ShowData()
{
char[,] StrArr = new char[4, 2] { { 'a', 'b'}, { 'c', 'd' },{ 'e', 'f' }, { 'g', 'h' } };

for (int i = 0; i < StrArr.GetLength(0); i++)
{
string str = string.Empty;
for (int j = 0; j < StrArr.GetLength(1); j++)
{
str += StrArr[i, j];
}
Label lbl = new Label();
lbl.Content = str;
lbl.Margin = new Thickness(20 * i,10,0,0);
this.main.Children.Add(lbl);
}
}


效果:

只能依次遍历数组的所有元素吗?有没有类似的方法,像一维char数组一样,直接.Tostring呢?
RunnerDNA 2019-07-25
  • 打赏
  • 举报
回复
简单写了下,wpf界面展示:
private void ShowData()
{
char[,] StrArr = new char[4, 2] { { 'a', 'b'}, { 'c', 'd' },{ 'e', 'f' }, { 'g', 'h' } };

for (int i = 0; i < StrArr.GetLength(0); i++)
{
string str = string.Empty;
for (int j = 0; j < StrArr.GetLength(1); j++)
{
str += StrArr[i, j];
}
Label lbl = new Label();
lbl.Content = str;
lbl.Margin = new Thickness(20 * i,10,0,0);
this.main.Children.Add(lbl);
}
}


效果:
ManBOyyy 2019-07-25
  • 打赏
  • 举报
回复
假设已有二维数组 array 行4, 列4
for(int i=0;i<4;i++)//行的行数
{
for(int j=0;j<4;j++)//行的列数
{
  console.wrie( array[i,j]+"\t" );
}
console.writeline();
}
XBodhi. 2019-07-25
  • 打赏
  • 举报
回复
引用 10 楼 秋的红果实 的回复:
说实话,我们平时很少用数组
你不是要string吗,大致这样

char[,] charArr = { { 'a', 'b', 'c' } , { 'd', 'e', 'f' } };
string[] strArr = new string[charArr.GetUpperBound(0) + 1]; //strArr的每个元素分别放到各个label
for(int i=0;i<=charArr.GetUpperBound(0);i++)
{
for(int j=0;j<=charArr.GetUpperBound(1);j++)
{
strArr[i] += charArr[i, j];
}
}



或者将二维数组转为交错数组

private char[][] convertArr(char[,] oldArr)
{
int len1 = oldArr.GetUpperBound(0);
int len2 = oldArr.GetUpperBound(1);

char[][] charArr2 = new char[len1+1][];

for (int i = 0; i <= len1; i++)
{
charArr2[i] = new char[len2 + 1];
for (int j = 0; j <= len2; j++)
{
charArr2[i][j] = oldArr[i, j];

}
}

return charArr2;
}


秋的红果实 2019-07-25
  • 打赏
  • 举报
回复
说实话,我们平时很少用数组 你不是要string吗,大致这样

char[,] charArr = { { 'a', 'b', 'c' } , { 'd', 'e', 'f' } };
string[] strArr = new string[charArr.GetUpperBound(0) + 1];  //strArr的每个元素分别放到各个label
for(int i=0;i<=charArr.GetUpperBound(0);i++)
{
    for(int j=0;j<=charArr.GetUpperBound(1);j++)
    {
        strArr[i] += charArr[i, j];
    }
}

或者将二维数组转为交错数组

private char[][] convertArr(char[,] oldArr)
{
    int len1 = oldArr.GetUpperBound(0);
    int len2 = oldArr.GetUpperBound(1);

    char[][] charArr2 = new char[len1+1][];

    for (int i = 0; i <= len1; i++)
    {
        charArr2[i] = new char[len2 + 1];
        for (int j = 0; j <= len2; j++)
        {
            charArr2[i][j] = oldArr[i, j];

        }
    }

    return charArr2;
}

七羽Y 2019-07-25
  • 打赏
  • 举报
回复
引用 6 楼 又青 的回复:
换成string类型的一维
string[] strArr = new string[4] { "ab", "cd", "ef", "gh" };

因为要从动态库里面传出,string[]数组只定义string类型的个数,并不定义每个字符串的长度,实际上string[]的地址指向为空,我就没有办法从动态库里面传出数据给这个地址了

110,531

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧