【问题标题】:Print a String to Matrix format column by column逐列打印字符串到矩阵格式
【发布时间】:2017-12-25 16:57:42
【问题描述】:

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

示例:
输入(字符串):

你好

输出(方阵):

---0  1  2  3

   0 H L R

   1 E O L

   2 L W D

   3 --O

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

我的 c 程序:

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”。

【问题讨论】:

  • 我建议您阅读 Eric Lippert 的 How to debug small programs,并了解如何使用调试器逐行执行代码。
  • 你应该缩进你的代码。

标签: c arrays string matrix dynamic


【解决方案1】:

像这样:

#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);
}

【讨论】:

【解决方案2】:

要动态获取大小,您应该选择 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] = '.';

【讨论】:

  • 由于可能会插入空格,dim 计算应该使用结果的长度。
  • int dim = (int) ceil(sqrt(sizeof(a)/sizeof(char)));字符 arr[dim][dim];我收到编译错误说“需要常量值”。在声明 char arr[4][4] 而不是 dim 时,它运行。有没有办法用 char arr[dim][dim]; 运行?
  • @VineethMourya 如果您不能使用 VLA,请使用 malloc
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-10
  • 1970-01-01
相关资源
最近更新 更多