逐列打印字符串到Matrix格式

时间:2017-07-20 06:46:55

标签: c arrays string matrix dynamic

使用给定字符串的字母逐列打印方形矩阵,重复的字母用空格分隔。方形矩阵的大小应根据填充给定字符串中字符所需的单元格计算。

例:
输入(字符串):

HELLOWORLD

输出(方块 - 矩阵):

---0  1  2  3

   0 H L R

   1 E O L

   2 L W D

   3 --O

----------------------------结束问题---------------- ----------

我的c-program:

void main()

{

char arr[4][4],a[]="HELLOWORLD";

int i,j,n=0;

clrscr();

for(i=0;i<4;i++)

{

    for(j=0;j<4;j++)

    {

        if(a[n]!=a[n+1]){

        arr[j][i]=a[n];

        n++;}

        else

        arr[j][i]=' ';

    }

}

for(i=0;i<4;i++){

for(j=0;j<4;j++){

printf("%c",arr[i][j]);}}

getch();

}

我没有得到所需的输出。请帮助代码。 感谢。

另外帮助我如何声明矩阵arr [X] [X]动态对应用户输入字符串如果需要3x3矩阵则说“WELCOME”。

2 个答案:

答案 0 :(得分:0)

要动态调整大小,您应该选择cmath库并使用sqrtceil函数

为什么ceil,以防你的字符串长度不是一个完美的正方形。

int dim = (int) ceil(sqrt(sizeof(a)/sizeof(char)));
char arr[dim][dim];

接下来迭代字符串,并使用rowcol整数变量迭代矩阵

int row=0, col=0;
for (i=0; i<sizeof(a)/sizeof(char); i++) {
    arr[row][col] = a[i];

    col++;
    if (col>=dim) {
        col = 0;
        row++;
    }
}

如果您担心未使用的单元格,如果字符串长度不是一个完美的正方形,那么请尽早初始化矩阵

for (i=0; i<dim; i++) 
    for (j=0; j<dim; j++)
        arr[i][j] = '.';

答案 1 :(得分:0)

像这样:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>

void square_output(const char *mes);

int main(void){
    square_output("HELLOWORLD");
    puts("");
    square_output("WELCOME");
    return 0;
}

void square_output(const char *mes){
    char *str = malloc(strlen(mes)*2);
    char *cp = str;
    char *matrix;
    int side, exp_len, mat_size;
    //separate of duplicate letter by ' '
    while(*mes){
        *cp++ = *mes++;
        if(mes[-1] == *mes)
            *cp++ = ' ';
    }
    *cp = 0;

    exp_len = cp - str;
    side = ceil(sqrt(exp_len));//dim
    mat_size = side * side;
    matrix = malloc(mat_size);//1D array
    memset(matrix, ' ', mat_size);//initialize by ' '
    memcpy(matrix, str, exp_len);
    {   //print
        int c, r;
        for(c = 0; c < side; ++c){
            for(r = 0; r < side; ++r){
                if(r)
                    putchar(' ');
                putchar(matrix[r * side + c]);//This means matrix[r][c] in 2D
            }
            puts("\n");
        }
    }
    free(matrix);
    free(str);
}