0

我正在尝试通过读取包含整数的文本文件stdin并将值存储在 9x9 数组中(请注意,文件必须通过stdin而不是作为 arg 读取)

这就是我所拥有的:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>


int main()
{
    int puzzle[9][9];
    int i,j,count=0;  
    char value[81];

    for( i = 0; i < 9; i++ ) {  
      for( j = 0; j < 9; j++ ) {  
        scanf("%c", &value[count]);  
        puzzle[i][j] = value[count] - '0'; 
        count++;  
      }
    }
}

但它似乎没有将 ASCII 字符从转换scanf为 int,这是我认为value[count] - '0'应该做的,所以我最终得到这样的值:

-16-16-160-16-160-16-161

基本上我正在尝试完全按照该线程中的描述进行操作,但使用 C 而不是 C++:

如何将 2d char 数组转换为 2d int 数组?

编辑 -

输入文件如下所示(包含空格和新行):

   0  0  1  9  0  0  0  0  8         
   6  0  0  0  8  5  0  3  0     
   0  0  7  0  6  0  1  0  0     
   0  3  4  0  9  0  0  0  0     
   0  0  0  5  0  4  0  0  0     
   0  0  0  0  1  0  4  2  0     
   0  0  5  0  7  0  9  0  0
   0  1  0  8  6  0  0  0  7
   7  0  0  0  0  9  2  0  0        
4

4 回答 4

2

问题不在于转换线puzzle[i][j] = value[count] - '0';。问题在于下面的scanf()陈述,scanf("%c", &value[count]);。scanf 正在读取第一个空格。用于scanf(" %c", &value[count]);读取输入。

于 2013-05-18T12:37:39.637 回答
2

%c确实做到了它应该做的事情:它读取一个字符。哦,是空格吗?那没关系。这就是为什么...

  • ...您不应该使用%c%d用于扫描整数;

  • ...你根本不应该使用scanf()像这样简单的东西。

如果我是你,我会怎么做:

int matrix[9][9];
int i = 0;

char buf[0x100];
while (fgets(buf, sizeof(buf), stdin)) {
    char *end;
    char *p = strtok_r(buf, " ", &end);
    while (p) {
        matrix[i / 9][i % 9] = strtol(p, NULL, 10);
        i++;
        p = strtok_r(NULL, " ", &end);
    }
}
于 2013-05-18T12:40:00.997 回答
0

有什么理由这不起作用吗?将它们扫描为整数。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>


int main()
{
    int puzzle[9][9];
    int i,j,count=0;  
    char value[81];

    for( i = 0; i < 9; i++ ) {  
      for( j = 0; j < 9; j++ ) {  
        scanf("%d", &value[count]);  
        puzzle[i][j] = value[count];
        printf("%d", puzzle[i][j]); //to verify it is stored correctly
        count++;  
      }
    }
}

编辑:既然你说它来自一个文件,我将你提供的示例文件复制/粘贴到 C:\file.txt 中,下面的代码似乎可以正常工作。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>


int main()
{
    FILE *fp;
    int puzzle[9][9];
    int i,j,count=0;  
    int value[81];
    fp = fopen("C:\\file.txt", "r");
    for( i = 0; i < 9; i++ ) {  
      for( j = 0; j < 9; j++ ) {
        fscanf(fp, " %d", &value[count]);
        puzzle[i][j] = value[count];
        printf("element %d is %d\n",count,  puzzle[i][j]);
        count++;

      }
    }
}
于 2013-05-18T12:37:26.610 回答
-1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main()
{
    //I relized that my solution need an other way of declaration and allocation
    //int puzzle[9][9];
    int *puzzle= (int*)malloc(9*9*sizeof(int));
    int i,j;  

    for( i = 0; i < 9; i++ ) {  
      for( j = 0; j < 9; j++ ) {  
        scanf("%d", puzzle+9*i+j)
      }
    }
}
于 2013-05-18T12:39:47.213 回答