【问题标题】:C: Reading multiple values with scanf and saving them into an arrayC:使用scanf读取多个值并将它们保存到数组中
【发布时间】:2018-03-04 22:14:38
【问题描述】:

我找到了问题第一部分的答案(如何使用 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'){}
    }
}

例如,如果第一个三角形的坐标是 (2,1)、(5,6)、(2,7),那么我想输入:“2 1 5 6 2 7”,结果我希望它按照我输入的顺序用上述数字填充数组的第一行。

显然它不起作用,程序在第一行给出后停止工作(没有完成工作,它停止了)。

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

如何解决?

【问题讨论】:

标签: c scanf


【解决方案1】:

当检测到像这样的输入错误时,你需要减去指针 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;
}

【讨论】:

  • 非常感谢,这正是我一直在寻找的!但是为什么这行得通而我的版本不行?我一直在使用类似的算法来检查错误,并且一直有效。
  • 文件末尾无限循环。
【解决方案2】:

不清楚为什么 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: ");
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-20
    • 2018-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多