2011-11-23 65 views
3

我需要一些帮助,我想从一个文件打印出来的信息(以字符)读取数据,并打印出其二维数组内容

我决定用一个二维数组,因为数据看起来是这样的

0 0 . . . 
0 0 . . . 
. . . . . 
. . . . . 
. . . . . 

看来我不能打印出来与我准备现在

请参阅下面的代码:

/* Read from file, pass on file contents to a 2D array, Print file contents from 2D array*/ 

#include<stdio.h> 
#include<string.h> 
#define N 5 


//My proposed function to print an array with contents from a file 
void printboard(int **a, int n, int n); 

int main(int argc, char *argv[]) 
{ 
    char linestr[100]; 
    int board[N][N]; 
    int k; 
    int h=0, l=0; 
    if(argc==2) //File should be called from the terminal hence working with argc & argv 
    { 
     FILE *fp; 
     fp = fopen(argv[1], "r"); 


    if(fp == NULL) 
     { 
      printf("Error, can't open '%s' file!!!\n", argv[1]); 
      return -1; 
     } 
    while (fgets(linestr,sizeof linestr, fp) != NULL) 
     for(k=0; k<strlen(linestr); k++) 
     { 
      if (linestr[k]!='\n') 
      { 
       board[h][l]=(int)linestr[k]; 
       l++; 


      } 
      h++; 
      l=0; 
     } 
     fclose(fp); 
    } 
    printboard(board,h,l); 

return 0; 
} 

void printboard(int **a, int n, int n) 
{ 
    int i, j; 
    for (i=0; i< N; i++) 
    { 
     for (j=0; j< N; j++) 
     { 
      printf("%c", a[i][j]); 
     } 
     printf("\n"); 
    } 


} 

我对C有非常基础的知识,只在1.5个月前开始编码。有没有来自社区的建议,我可以如何解决这个问题或做得更好?其目的是以2D阵列格式打印文件的内容。我真的希望将数据用于二维数组,因为我需要进一步研究它以在称为Peg Solitaire的游戏中移动“0”。

+1

尽管你有2个具有相同名称未使用的参数,你printboard方法,你可以对什么是错/最新预期的更精确? – DarkSquirrel42

+0

我假设你指的是int n;在打印板功能中出现两次 – victoria277

+1

这实在太多代码了。将来,把它归结为一个最小的例子。在这个过程中,你可能会发现自己的错误。 – dmckee

回答

0

我只是猜测在这里,当字段为空时显示点(。) 所以预先填充您的电路板阵列。

char board[N][N]; // i changed it to char, was int but char is enough 
memset(board, '.', sizeof(board)); 
1

函数中的参数名称必须是唯一的。所以你的打印板功能不能有两个“n”参数,你必须改变一个名字(“m”或其他)。另外,既然你打印了n×n个矩阵,并且你已经通过预处理器定义了“N”,你甚至需要这些参数吗? :)

数组的传递(打印板的第一个参数)有点棘手,需要一些关于指针和内存如何工作的知识。看到这里讨论:

http://cboard.cprogramming.com/c-programming/97898-passing-2-dimensional-array-function.html

这是什么归结为是改变你的函数定义:

void printboard(int a[][N], int m, int n); 

一个小东西:为了打印,你可能想将它们打印为整数你的号码而不是字符,所以你应该改变

printf("%c", a[i][j]); 

printf("%d ", a[i][j]); 

我添加了空格,这样数字在打印到终端时将一起运行。

就解析输入而言,这是一个完整的强大主题。我建议strtok在你从文件中读取它们的时候打破你的界限。然后你会使用像sscanf这样的东西来将数据存储到你的电路板阵列中。看到这些裁判:

http://www.cplusplus.com/reference/clibrary/cstdio/sscanf/ http://www.cplusplus.com/reference/clibrary/cstring/strtok/

+0

我试验了没有两个参数和N #defined它似乎编译正确,但现在我似乎打印出来的缓冲区,当我使用“%c”,在函数,现在是void printboard(int a [] [N])和ascii代码当使用“%d”时,我会检查你的链接,尽管谢谢 – victoria277