不想起名字a 发表于 2022-9-7 14:16:34

求大佬帮忙,不懂为什么for循环中k-1输出结果就少了第4个元素和第8个元素

本帖最后由 不想起名字a 于 2022-9-7 18:33 编辑

#include<stdio.h>
#include<string.h>
#define Max 1024
int main()
{
        char a;
        int length;
        int i, j, k = 0;
        gets(a);
        length = strlen(a);
        while(++k*k <= length);
        char (*p) = (char(*))&a;
        for(i = 0; i < k-1; i++)
        {
                for(j = 0; j < k-1; j++)
                {
                        printf("%c ",p(i));//这里i处为"[]",会变成斜体字
                }
                printf("\n");
        }
        return 0;
}
然而想要矩阵输出需要使k的值减一

不想起名字a 发表于 2022-9-7 15:54:43

本帖最后由 不想起名字a 于 2022-9-7 16:07 编辑

当把for循环中的k-1换成k的时候输出结果是没有问题的,但是输出结果不是(k-1) * (k-1)的矩阵

wp231957 发表于 2022-9-7 14:46:26

while(++k*k <= length);这语句想表达什么呢?!看不懂啊

不想起名字a 发表于 2022-9-7 15:15:21

wp231957 发表于 2022-9-7 14:46
while(++k*k

k的平方大于length的时候结束while循环,由k-1得出矩阵的长度

wp231957 发表于 2022-9-7 15:17:21

不想起名字a 发表于 2022-9-7 15:15
k的平方大于length的时候结束while循环,由k-1得出矩阵的长度

这里不要使用复合语句,把k*k 和++k拆开写

不想起名字a 发表于 2022-9-7 15:37:04

wp231957 发表于 2022-9-7 15:17
这里不要使用复合语句,把k*k 和++k拆开写

while(k*k <= length)
                k++;
这样写也不行,输入123456789 依然缺少4和8

cnkizy 发表于 2022-9-7 15:40:40

你这是啥编译器呀
char (*p) = (char(*))&a;能通过编译?
{:10_257:}

不想起名字a 发表于 2022-9-7 15:47:29

cnkizy 发表于 2022-9-7 15:40
你这是啥编译器呀
char (*p) = (char(*))&a;能通过编译?

可以啊 把一维数组强制转化为二维数组 我也是从小甲鱼的课后作业上才学到这个的

cnkizy 发表于 2022-9-7 16:52:48

一个小建议。
while(++k*k <= length);容易导致UB
建议改成
while (k * k <= length)k++;

不想起名字a 发表于 2022-9-7 17:06:37

cnkizy 发表于 2022-9-7 16:52
一个小建议。
while(++k*k

嗯嗯 谢谢

gandixiwang 发表于 2022-9-7 18:08:56

你是怎么通过编译的,我怎么通不过{:5_104:}

cnkizy 发表于 2022-9-7 18:17:59



#include<string.h>
#define Max 1024

int main() {
        char a;
        int length;
        int i, j = 0, k = 0;
        gets_s(a, Max);

        // 求长度
        length = strlen(a);
       
        // k = 求log(2,length)
        while (k * k <= length)k++;
        k--;

        // 打印 k * k 方阵
        for (i = 0; i < k; i++) {
                for (; j <= (1+i)*(k-1); j++) {
                        printf("%c ", *((char*)a + i * sizeof(char) + j));
                }
                j--;
                printf("\n");
        }
        return 0;
}

jhq999 发表于 2022-9-7 18:23:05

gandixiwang 发表于 2022-9-7 18:08
你是怎么通过编译的,我怎么通不过

p[i]

gandixiwang 发表于 2022-9-7 18:24:58

是这样吗
如果是这样的话把 k-1 的-1 去掉就行了
代码
#include<stdio.h>
#include<string.h>
#define Max 1024
int main()
{
        char a;
        int length;
        int i, j, k = 0;
        gets(a);
        length = strlen(a);
        while(k*k < length)
                k++;
        char (*p) = (char(*))&a;
        for(i = 0; i < k; i++)
        {
                for(j = 0; j < k; j++)
                {
                        printf("%c ",p);//这里i处为"[]",会变成斜体字
                }
        }
        return 0;
}

gandixiwang 发表于 2022-9-7 18:26:24

还有
while(++k*k <= length);
改成
        while(k*k < length)
                k++;

不想起名字a 发表于 2022-9-7 18:37:13

cnkizy 发表于 2022-9-7 18:17


感谢感谢,膜拜大佬

两手空空儿 发表于 2022-9-7 18:56:21

你输入 123456789
while(++k*k <= length);这里计算以后K=4;
char (*p) = (char(*))&a; 这里就是一个4个元素跨度的指针,
数组变成了
1 2 3 4
5 6 7 8
9
输出3X3,那4和8就会丢失啊

cnkizy 发表于 2022-9-7 19:00:12

两手空空儿 发表于 2022-9-7 18:56
你输入 123456789
while(++k*k

正解!

不想起名字a 发表于 2022-9-7 22:08:28

两手空空儿 发表于 2022-9-7 18:56
你输入 123456789
while(++k*k

感谢解惑,感谢感谢
页: [1]
查看完整版本: 求大佬帮忙,不懂为什么for循环中k-1输出结果就少了第4个元素和第8个元素