鱼C论坛

 找回密码
 立即注册
查看: 2328|回复: 18

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

[复制链接]
发表于 2022-9-7 14:16:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

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

int main() {
        char a[Max];
        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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-9-7 15:54:43 | 显示全部楼层
本帖最后由 不想起名字a 于 2022-9-7 16:07 编辑

当把for循环中的k-1换成k的时候输出结果是没有问题的,但是输出结果不是  (k-1) * (k-1)  的矩阵
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-7 14:46:26 From FishC Mobile | 显示全部楼层
while(++k*k <= length);这语句想表达什么呢?!看不懂啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-7 15:15:21 | 显示全部楼层

k的平方大于length的时候结束while循环,由k-1得出矩阵的长度
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

这里不要使用复合语句,把k*k 和++k  拆开写
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-7 15:37:04 | 显示全部楼层
wp231957 发表于 2022-9-7 15:17
这里不要使用复合语句,把k*k 和++k  拆开写

while(k*k <= length)
                k++;
这样写也不行,输入123456789 依然缺少4和8
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-7 15:40:40 | 显示全部楼层
你这是啥编译器呀
char (*p)[k] = (char(*)[k])&a;  能通过编译?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-7 15:47:29 | 显示全部楼层
cnkizy 发表于 2022-9-7 15:40
你这是啥编译器呀
char (*p)[k] = (char(*)[k])&a;  能通过编译?

可以啊 把一维数组强制转化为二维数组 我也是从小甲鱼的课后作业上才学到这个的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-7 16:52:48 | 显示全部楼层
一个小建议。
while(++k*k <= length);  容易导致UB
建议改成
while (k * k <= length)k++;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-7 17:06:37 | 显示全部楼层
cnkizy 发表于 2022-9-7 16:52
一个小建议。
while(++k*k

嗯嗯 谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-7 18:08:56 | 显示全部楼层
你是怎么通过编译的,我怎么通不过
无标题.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-7 18:17:59 | 显示全部楼层    本楼为最佳答案   
12311.png
#include<string.h>
#define Max 1024

int main() {
        char a[Max];
        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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-7 18:23:05 | 显示全部楼层
gandixiwang 发表于 2022-9-7 18:08
你是怎么通过编译的,我怎么通不过

p[i][j]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-7 18:24:58 | 显示全部楼层
是这样吗
如果是这样的话把 k-1 的-1 去掉就行了
代码
#include<stdio.h>
#include<string.h>
#define Max 1024
int main()
{
        char a[Max];
        int length;
        int i, j, k = 0;
        gets(a);
        length = strlen(a);
        while(k*k < length)
                k++;
        char (*p)[k] = (char(*)[k])&a;
        for(i = 0; i < k; i++)
        {
                for(j = 0; j < k; j++)
                {
                        printf("%c ",p[i][j]);//这里i处为"[]",会变成斜体字
                }
        }
        return 0;
}
1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-7 18:26:24 | 显示全部楼层
还有
while(++k*k <= length);
改成
        while(k*k < length)
                k++;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-7 18:37:13 | 显示全部楼层

感谢感谢,膜拜大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-7 18:56:21 | 显示全部楼层
你输入 123456789
while(++k*k <= length);  这里计算以后K=4;
char (*p)[k] = (char(*)[k])&a; 这里就是一个4个元素跨度的指针,
数组变成了
1 2 3 4
5 6 7 8
9
输出3X3,那4和8就会丢失啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2022-9-7 19:00:12 | 显示全部楼层
两手空空儿 发表于 2022-9-7 18:56
你输入 123456789
while(++k*k

正解!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-7 22:08:28 | 显示全部楼层
两手空空儿 发表于 2022-9-7 18:56
你输入 123456789
while(++k*k

感谢解惑,感谢感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 03:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表