C:使用scanf读取多个值并将其保存到数组中

C:使用scanf读取多个值并将其保存到数组中,c,scanf,C,Scanf,我找到了问题第一部分的答案(如何使用scanf读取多个值),但它似乎对我不起作用(我认为这是因为将值放入数组,也可能是因为我正在检查给定的值是否为6整数): 我正在写一个程序,在一个数组中存储4个三角形的坐标。每条线有6个值,并存储一个三角形的坐标。我想一次读取6个坐标,并分别对4个三角形执行此操作 int tab[4][6]; for (int i = 0; i < 4; i++){ while (scanf("%d %d %d %d %d %d", &tab[i][0

我找到了问题第一部分的答案(如何使用scanf读取多个值),但它似乎对我不起作用(我认为这是因为将值放入数组,也可能是因为我正在检查给定的值是否为6整数):

我正在写一个程序,在一个数组中存储4个三角形的坐标。每条线有6个值,并存储一个三角形的坐标。我想一次读取6个坐标,并分别对4个三角形执行此操作

int tab[4][6];

for (int i = 0; i < 4; i++){
    while (scanf("%d %d %d %d %d %d", &tab[i][0], &tab[i][1], &tab[i][2], &tab[i][3], &tab[i][4], &tab[i][5]) != 6){
        printf("Error, try again: ");
        while (getchar() != '\n'){}
    }
}
int选项卡[4][6];
对于(int i=0;i<4;i++){
而(scanf(“%d%d%d%d%d%d%d%d”、&tab[i][0]、&tab[i][1]、&tab[i][2]、&tab[i][3]、&tab[i][4]、&tab[i][5])!=6){
printf(“错误,请重试:”;
而(getchar()!='\n'{}
}
}
例如,如果第一个三角形的坐标是(2,1),(5,6),(2,7),那么我想输入:“2,1,5,6,2,7”,结果我想让它按照我输入的顺序用这些数字填充数组的第一行

显然它不工作,程序在给出第一行后停止工作(不是完成工作,而是停止)

我在调试后(给出第一行后)出现此错误: “xxx.exe中0x0FDCC28C(msvcr120d.dll)处的未处理异常:0xC0000005:访问冲突写入位置0xcccc。”


如何修复它?

在检测输入错误时,需要减去指针i,例如->

#include <stdio.h>
int main(int argc, const char * argv[]) {
    int tab[4][6];
    for (int i = 0; i < 4; i++){
        printf("Enter 6 values \n");
        int retVal=scanf("%d %d %d %d %d %d", &tab[i][0], &tab[i][1], &tab[i][2], &tab[i][3], &tab[i][4], &tab[i][5]);
        if (retVal == 6) {
            printf("You did enter -> %d %d %d %d %d %d\n",tab[i][0],tab[i][1],tab[i][2],tab[i][3],tab[i][4],tab[i][5]);
        } else {
            printf("Error entering values.. (Enter numbers). \n");
            while (getchar() != '\n'){}
            i--;
        }
    }
    return 0;
}
#包括
int main(int argc,const char*argv[]{
int tab[4][6];
对于(int i=0;i<4;i++){
printf(“输入6个值\n”);
int-retVal=scanf(“%d%d%d%d%d%d%d”、&tab[i][0]、&tab[i][1]、&tab[i][2]、&tab[i][3]、&tab[i][4]、&tab[i][5]);
如果(retVal==6){
printf(“您确实输入了->%d%d%d%d%d%d\n”,页签[i][0],页签[i][1],页签[i][2],页签[i][3],页签[i][4],页签[i][5]);
}否则{
printf(“输入值时出错…(输入数字)。\n”);
而(getchar()!='\n'{}
我--;
}
}
返回0;
}

不清楚为什么OP的代码在没有发布使用的输入和以前的代码的情况下失败


如何修复它

使用
fgets()
读取一行用户输入。避免将先前代码中的
scanf()
fgets()
混合使用。然后解析缓冲区。在结尾使用
“%n”
查找成功和额外文本

int tab[4][6];
char buf[6*12 * 2];  // Use a buffer twice expected max needs

for (int i = 0; i < 4; i++) {
  while (1) {
    if (fgets(buf, size  buf, stdin) == NULL) {
      return "Failed to read enough data"; // Handle end-of-file in some fashion
    }
    int n = 0;
    sscanf(buf, "%d%d%d%d%d%d %n", 
        &tab[i][0], &tab[i][1], &tab[i][2], &tab[i][3], &tab[i][4], &tab[i][5], &n);
    if (n > 0 && buf[n] == 0) {
      break;  // Success!
    }
    printf("Error - bad input, try again: ");
  }
}
int选项卡[4][6];
字符buf[6*12*2];//使用两倍于预期最大需要的缓冲区
对于(int i=0;i<4;i++){
而(1){
if(fgets(buf,size-buf,stdin)=NULL){
return“未能读取足够的数据”;//以某种方式处理文件结尾
}
int n=0;
sscanf(基本单位,“%d%d%d%d%d%n”,
&制表符[i][0]、&制表符[i][1]、&制表符[i][2]、&制表符[i][3]、&制表符[i][4]、&制表符[i][5]、&n);
如果(n>0&&buf[n]==0){
打破;//成功!
}
printf(“错误-输入错误,请重试:”;
}
}

?这对一个人来说是不够的。。请发布一个。你能发布编译器的实际错误消息吗?代码似乎还可以,也许你没有包括stdio.h?@Pablo“参见‘scanf’声明”,我也包括了它。请逐字记录编译器错误。非常感谢,这正是我一直在寻找的!但为什么这能起作用而我的版本不行呢?我一直在使用类似的算法来检查错误,它总是有效的。文件末尾的无限循环。