我找到了问题第一部分的答案(如何用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),那么我想输入:&#34; 2 1 5 6 2 7&#34;因此我希望它按照我输入的顺序用数字填充数组的第一行。
显然它不起作用,程序在给出第一行后停止工作(不完成工作,停止)。
我在调试后得到这个错误(在给出第一行之后): &#34; xxx.exe中0x0FDCC28C(msvcr120d.dll)的未处理异常:0xC0000005:访问冲突写入位置0xCCCCCCCC。&#34;
如何解决?
答案 0 :(得分:4)
当检测到输入错误时,你需要减去指针i,例如 - &gt;
#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;
}
答案 1 :(得分:-1)
不清楚为什么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: ");
}
}