Cool_Breeze 发表于 2020-2-22 20:43:13

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

本帖最后由 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[]);
        void init(int (*p),char (*p1));
       
        FILE *a_txt=fp(argv,"r");
        FILE *b_txt=fp(argv,"w");
       
        int n=0;
        char mu="0";
        char temp_1[]={"0"};
        char temp="0";
        int arr={0};
        int (*p_arr)=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); //这里打印没有问题
        }
        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[])
{
        int i,j=0,k=0;
        for (i=0;*(p+i)!='\0';i++)
        {
                if (*(p+i)!=' ' && *(p+i)!='\n')
                {
                        t=*(p+i);
                        k++;
                }
                else
                {
                        t='\0';
                        j++,k=0;
                }
        }
}
void init(int (*p_arr),char (*p1))
{
        static int count=0;
        int i;
        for (i=0;i<5;i++)
        {
                *(*(p_arr+count)+i)=atoi(*(p1+i));
        }
        count++;
}

Cool_Breeze 发表于 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

Cool_Breeze 发表于 2020-2-22 20:44:53

本帖最后由 Cool_Breeze 于 2020-2-22 21:50 编辑

{:5_100:}

Cool_Breeze 发表于 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

major_lyu 发表于 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的首地址.你想让这句打印什么呢??

chxchxkkk 发表于 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;

Cool_Breeze 发表于 2020-2-24 11:02:11

本帖最后由 Cool_Breeze 于 2020-2-24 11:51 编辑

{:5_90:}

Cool_Breeze 发表于 2020-2-24 11:09:04

本帖最后由 Cool_Breeze 于 2020-2-24 11:51 编辑

{:5_90:}

Cool_Breeze 发表于 2020-2-24 11:44:37

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

是应为后面无法打印数组内容!所以加了一个return!

Cool_Breeze 发表于 2020-2-24 11:47:03

major_lyu 发表于 2020-2-22 22:16
printf("%d",arr); //这里arr是个数组,数组名代表数组的首地址.因此这句话打印的就是数组第0个元素 ...

我其实是想打印数组第一个元素出来的!应该写成arr;对吧!

Cool_Breeze 发表于 2020-2-24 11:57:37

终于搞定了!谢谢你们!!!{:5_109:}
#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,"r");
        FILE *b_txt=fp(argv,"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="0";                                        //储存第一行数据
        char temp_1={"0"};   //存储分割好的数据
        char temp="0";                        //存储一行数据
        int arr={0};                         //存储最终数组
        int (*p_arr)=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,width,width);      //将数据分割成二维字符串
                init(temp_1,arr,width,width);   //将二维字符串赋值给二维数组
                //for (int i=0;i<5;i++) printf("%d ",arr); //这里打印没有问题
        }
        //for (int i=0;i<5;i++) printf("%s ",temp_1); //这里打印没有问题
        //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;
        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);
        }
}

zhyyhz 发表于 2020-2-28 20:53:13

6
页: [1]
查看完整版本: 将一个文本数据赋值给二维数组失败!(求大佬相助!!!)