我目前正在尝试创建一个 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;
}
}
}
这里有一大堆问题。
int
但没有返回。在 key_matrix
的情况下,正确的返回类型应该是 void
,因为此函数似乎仅设计用于打印输出。(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");
}
}