将字符串转换为n * n ascii值矩阵

问题描述 投票:0回答:1

我目前正在尝试创建一个 c 函数,将字符串转换为由字符串字符的 ascii 值组成的 n*n 矩阵。例如,字符串“Wordsss”应该给出一个矩阵,例如

87  111 82
100 115 115
115 0   0

不同值之间的空格应该是表格。 我当前的代码是:

int matrix_size(int length)
{
    int n = 0;
    double square = sqrt(length);

    if ((int)square % 1 != 0 ){
        n = ((square / 1) - ((int)square % 1)) + 1;
        length = n;
    } else {
        n = square + 1;
        length = n;
    }
}
int key_matrix(int ac, char **av)
{
    int length = strlen(av[2]);
    int i = 0;
    int j = 0;
    int n = matrix_size(length);
    int limit = pow(n, 2);

    while(i < limit){
        if(i % n == 0 && i != 0){
            printf("%d\n", av[2][i]);
            ++i;
        } else if (i > length && i < limit){
            printf("%d\t", 2);
        } else {
            printf("%d\t", av[2][i]);
            ++i;
      }
   }
}
c matrix
1个回答
0
投票

这里有一大堆问题。

  • 您的两个函数都会调用未定义的行为,因为它们承诺返回
    int
    但没有返回。在
    key_matrix
    的情况下,正确的返回类型应该是
    void
    ,因为此函数似乎仅设计用于打印输出。
  • 正如 Barmar 所说,
    (int)square % 1 != 0
    始终正确。
  • matrix_size
    中,您采取的最后一个操作是分配给
    length
    ,但由于 length 是局部变量(参数),因此这不起作用。您可能认为这会修改传入的参数,但要做到这一点,您必须传递一个指针,然后分配给该内存位置。
  • 您测试
    av
    int length = strlen(av[2]);
    的第三个元素的长度,而不检查数组是否包含那么多字符串。据推测
    ac
    包含此信息。目前还不清楚为什么数组中的第三个字符串很重要。

如果我想根据字符串的长度获得输出矩阵的大小,我会找到平方根的下限。如果乘以 my 本身就可以得到原始长度,那么就可以了。这涵盖了 9 或 16 等数字。否则,它将返回该数字加一。

这可以巧妙地处理浮点数学表示 10000 之类的平方根是 99.999999...而不是 100 的情况。

size_t matrix_dimension(size_t length) {
    size_t s = floor(sqrt((double)length));

    if (s * s == length) {
        return s;
    }
    else {
        return s + 1;
    }   
}

现在,我将编写一个函数来打印 one 字符串的“矩阵”。如果我们需要处理多个,我们可以简单地编写一个循环并多次调用该函数。

请注意,我在格式说明符上使用宽度说明符来实现制表而不是制表符。

void print_matrix(char *str) {
    size_t slen = strlen(str);
    size_t len = matrix_dimension(slen);

    for (size_t i = 0; i < len; i++) {
        for (size_t j = 0; j < len; j++) {
            size_t k = i * len + j;

            if (k >= slen) {
                printf("%4d", 0);
            }
            else {
                printf("%4d", (int)str[k]);
            }
        }
        printf("\n");
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.