鱼C论坛

 找回密码
 立即注册
查看: 1677|回复: 11

[已解决]将一个文本数据赋值给二维数组失败!(求大佬相助!!!)

[复制链接]
发表于 2020-2-22 20:43:13 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 Cool_Breeze 于 2020-2-22 21:48 编辑
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

FILE *fp(char *,const char *);

int main(int argc,char *argv[])
{
        void anay(char *,char t[][5]);
        void init(int (*p)[5],char (*p1)[5]);
        
        FILE *a_txt=fp(argv[1],"r");
        FILE *b_txt=fp(argv[2],"w");
        
        int n=0;
        char mu[20]="0";
        char temp_1[][5]={"0"};
        char temp[100]="0";
        int arr[50][5]={0};
        int (*p_arr)[5]=arr;
        
        fgets(mu,100,a_txt);
        fprintf(b_txt,"%s",mu);
        
        for (n=0;fgets(temp,20,a_txt)!=NULL;n++)
        {
                anay(temp,temp_1);      //将数据分割成二维字符串 
                init(p_arr,temp_1);   //将二维字符串赋值给二维数组 
                for (int i=0;i<5;i++) printf("%d ",arr[n][i]); //这里打印没有问题 
        }
        printf("%d",arr); //到这里就访问数据就错了 
        return 0;
        p_arr=arr;
        int i,j;
        for (i=0;i<n;i++)
        {
                for (j=0;j<5;j++)
                {
                        printf("%d ",*(*(p_arr+i)+j));
                }
        }
        fclose(a_txt);
        fclose(b_txt);
        return 0;
        
        
}

FILE *fp(char *p,const char *mode)
{
        FILE *pp;
        if ((pp= fopen(p,mode))==NULL)
        {
                printf("open fail! %s",p);
                getchar();
                exit (0);
        }
        return pp;
}
void anay(char *p,char t[][5])
{
        int i,j=0,k=0;
        for (i=0;*(p+i)!='\0';i++)
        {
                if (*(p+i)!=' ' && *(p+i)!='\n')
                {
                        t[j][k]=*(p+i);
                        k++;
                }
                else
                {
                        t[j][k]='\0';
                        j++,k=0;
                }
        }
}
void init(int (*p_arr)[5],char (*p1)[5])
{
        static int count=0;
        int i;
        for (i=0;i<5;i++)
        {
                *(*(p_arr+count)+i)=atoi(*(p1+i));
        }
        count++;
}
最佳答案
2020-2-22 22:16:04
本帖最后由 major_lyu 于 2020-2-22 22:20 编辑
Cool_Breeze 发表于 2020-2-22 20:44
最后一次打印就不对了


printf("%d",arr); //这里arr是个数组,数组名代表数组的首地址.因此这句话打印的就是数组第0个元素的地址;那串奇怪的数字就是数组arr的首地址.你想让这句打印什么呢??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-2-22 20:44:07 | 显示全部楼层
本帖最后由 Cool_Breeze 于 2020-2-22 21:50 编辑

最后一次打印就不对了
d:\GIN\c\test>1805-1.exe a.txt b.txt
79 77 70 77 67 64 70 74 75 72 79 64 72 62 76 62 75 65 71 63 79 76 62 62 77 66 63
 77 75 79 74 75 72 61 61 71 63 79 60 70 74 64 74 78 69 2292224
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-22 20:44:53 | 显示全部楼层
本帖最后由 Cool_Breeze 于 2020-2-22 21:50 编辑

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-2-22 20:45:42 | 显示全部楼层
以下是文本内容!
语文 数学 英语 化学 生物
79 77 70 77 67
64 70 74 75 72
79 64 72 62 76
62 75 65 71 63
79 76 62 62 77
66 63 77 75 79
74 75 72 61 61
71 63 79 60 70
74 64 74 78 69
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-22 22:16:04 | 显示全部楼层    本楼为最佳答案   
本帖最后由 major_lyu 于 2020-2-22 22:20 编辑
Cool_Breeze 发表于 2020-2-22 20:44
最后一次打印就不对了


printf("%d",arr); //这里arr是个数组,数组名代表数组的首地址.因此这句话打印的就是数组第0个元素的地址;那串奇怪的数字就是数组arr的首地址.你想让这句打印什么呢??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-23 10:55:17 | 显示全部楼层
printf("%d",arr); //到这里就访问数据就错了 ==》正如楼上说的,arr是数组首地址,要打印数组内容,需要循环遍历
        return 0;                                          ==》遇到return 函数执行结束,退出,后面一系列的语句都不会执行
        p_arr=arr;
        int i,j;
        for (i=0;i<n;i++)
        {
                for (j=0;j<5;j++)
                {
                        printf("%d ",*(*(p_arr+i)+j));
                }
        }
        fclose(a_txt);
        fclose(b_txt);
        return 0;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-24 11:02:11 | 显示全部楼层
本帖最后由 Cool_Breeze 于 2020-2-24 11:51 编辑

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-2-24 11:09:04 | 显示全部楼层
本帖最后由 Cool_Breeze 于 2020-2-24 11:51 编辑

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-2-24 11:44:37 | 显示全部楼层
chxchxkkk 发表于 2020-2-23 10:55
printf("%d",arr); //到这里就访问数据就错了 ==》正如楼上说的,arr是数组首地址,要打印数组内容,需要循 ...

是应为后面无法打印数组内容!所以加了一个return!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-24 11:47:03 | 显示全部楼层
major_lyu 发表于 2020-2-22 22:16
printf("%d",arr); //这里arr是个数组,数组名代表数组的首地址.因此这句话打印的就是数组第0个元素 ...

我其实是想打印数组第一个元素出来的!应该写成arr[0][0];对吧!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-24 11:57:37 | 显示全部楼层
终于搞定了!谢谢你们!!!
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LINE_SIZE 100                //行存储大小 


FILE *fp(char *,const char *);
int check_width(FILE *fp);
int check_high(FILE *fp);

int main(int argc,char *argv[])
{
        
        FILE *a_txt=fp(argv[1],"r");
        FILE *b_txt=fp(argv[2],"w");
        
        int width=0,high=0; 
        width=check_width(a_txt);
        high=check_high(a_txt);
        
        void anay(char *,char *,int linesize,int width);         //把二维素组做一维数组传递 
        void init(char *,int  *,int linesize,int width);                //把二维素组做一维数组传递 

        char mu[LINE_SIZE]="0";                                        //储存第一行数据 
        char temp_1[high][width]={"0"};   //存储分割好的数据 
        char temp[LINE_SIZE]="0";                        //存储一行数据 
        int arr[high][width]={0};                         //存储最终数组 
        int (*p_arr)[width]=arr;
        
        rewind(a_txt);
        fgets(mu,LINE_SIZE,a_txt);
        fprintf(b_txt,"%s",mu);
        int i;
        for (i=0;fgets(temp,LINE_SIZE,a_txt)!=NULL;i++)
        {
                anay(temp,temp_1[0],width,width);      //将数据分割成二维字符串 
                init(temp_1[0],arr[i],width,width);   //将二维字符串赋值给二维数组 
                //for (int i=0;i<5;i++) printf("%d ",arr[n][i]); //这里打印没有问题 
        }
        //for (int i=0;i<5;i++) printf("%s ",temp_1[i]); //这里打印没有问题 
        //printf("%d",arr); //到这里就访问数据就错了 
        //return 0;
        p_arr=arr;
        int j;
        for (i=0;i<high;i++)
        {
                for (j=0;j<width;j++)
                {
                        printf("%d ",*(*(p_arr+i)+j));
                }
                putchar('\n');
        }
        fclose(a_txt);
        fclose(b_txt);
        return 0;
        
        
}

FILE *fp(char *p,const char *mode)
{
        FILE *pp;
        if ((pp= fopen(p,mode))==NULL)
        {
                printf("open fail! %s",p);
                getchar();
                exit (0);
        }
        return pp;
}
//检查数据
int check_width(FILE *fp) 
{
        rewind(fp);
        char delims='0';
        int w=1;
        for (;(delims=fgetc(fp))!='\n';)
        {
                if (delims==' ') w++;
        }
        return w;
}
int check_high(FILE *fp)
{
        rewind(fp);
        int h=0;
        char arr[LINE_SIZE];
        for (;fgets(arr,LINE_SIZE,fp)!=NULL;h++);
        return h-1;                //去掉第一行不算 
}
void anay(char *p,char *t,int linesize, int width)
{
        int i,j=0,k=0;                        //j第二维,k第一维 
        for (i=0;*(p+i)!='\0';i++)
        {
                if (*(p+i)!=' ' && *(p+i)!='\n')
                {
                        *(t+j*linesize+k)=*(p+i);
                        k++;
                }
                else
                {
                        *(t+j*linesize+k)='\0';
                        j++,k=0;
                }
        }
}
void init(char *p,int *p1,int linesize,int width)
{
        int i;
        for (i=0;i<width;i++)
        {
                *(p1+i)=atoi(p+i*linesize);
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-28 20:53:13 | 显示全部楼层
6
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-15 23:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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