从stdin读取整数并存储在2d数组中(C)

时间:2013-05-18 12:31:16

标签: c

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

这就是我所拥有的:

#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++;  
      }
    }
}

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

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

基本上我正在尝试完成这个帖子中描述的内容,但是在C而不是C ++:

How to convert a 2d char array to a 2d int array?

修改

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

   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 个答案:

答案 0 :(得分:2)

问题不在于转换行puzzle[i][j] = value[count] - '0';。问题在于以下scanf()语句scanf("%c", &value[count]);。 scanf正在读取第一个空白区域。使用scanf(" %c", &value[count]);读取输入。

答案 1 :(得分: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);
    }
}

答案 2 :(得分: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++;

      }
    }
}

答案 3 :(得分:-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)
      }
    }
}