2011-03-23 56 views
3

即时通讯新的C和不能为我的生活弄清楚我在这里做错了什么。第一个scanf工作正常,变量在读入时打印出来。第二个scanf似乎没有正确读取输入。输入格式为“char int int”,即当我打印opb x和y out,opb =“”,x = 13238272,y = 0时,输出格式为b 4 4
。 什么想法?.....注IVE切出代码的问题C scanf()问题

int main(void) 
{ 

/*initialize variables*/ 
int width, height; 
char op; 

/*grid input*/ 
scanf("%c %d %d", &op, &width, &height); 

/*check conditions*/ 
if (op != 'g' || width>100 || height>100 || width*height<10 || width<1 || height<1) { 
    printf("grid-error\n"); 
    return 0; 
} 

/*initialize grid elements*/ 
int grid[width][height]; 
char printGrid[width][height]; 

/*create grid elements*/ 
int i, j; 
for (i=0; i<height; i++) { 
    for (j=0; j<width; j++) { 
     grid[j][i] = 0; 
     printGrid[j][i] = '*'; 
    } 
} 

/*print successful creation*/ 
printf("%c %d %d \n", op, width, height); 

int k; 
for (k = 0; k<10; k++) { 
    /*initialize variables*/ 
    int x, y; 
    char opb; 

    /*mine input*/ 
    scanf("%c %d %d", &opb, &x, &y); 

    /*check conditions*/ 
    if (opb != 'b' || x<0 || y<0 || x>(width-1) || y>(height-1) || grid[x][y] == 9) { 
     printf("mine-error\n"); 
     return 0; 
    } 
+0

您应该检查scanf函数的'()'的返回值,因为它是你就会知道,如果有一个格式错误的唯一方法。 – geekosaur 2011-03-23 06:04:17

+1

你看起来是一个格式错误(因为它没有返回3),这是怎么回事? – Milk 2011-03-23 06:13:07

+1

@ user445559:我发生的一件事情是,'%c'将读取下一个可用字符 - 即使它是空格或读取上一行时留下的换行符。一般来说,以行的形式读取输入并使用'sscanf()'来解析它们会更安全。 – geekosaur 2011-03-23 06:15:30

回答

4

下面我怀疑的问题是,你不处理换行符在你的输入。结果是opb实际上是一个换行符(不是空格,虽然它看起来像一个),并且xy根本不被读取(即它们保留它们被初始化的值)。

要解决此问题,请尝试向两个scanfs添加换行符。那就是:

scanf("%c %d %d\n", &op, &width, &height); 

后来

scanf("%c %d %d\n", &opb, &x, &y); 
+0

谢谢,我试过这个,但现在它只是挂在第一个scanf() ,所以输入: “g 10 10 ”它会转到下一行,直到我按ctrl + d,然后它继续,因为它应该 – Milk 2011-03-23 22:58:14

+0

是的,我相信这是由于键盘输入缓冲的方式。如果您将第一个scanf更改为'scanf(“%c%d%d”,&op,&width,&height);'并将第二个scanf更改为'scanf(“\ n%c%d%d”,&opb,&x ,&y);'它不会挂起,关键是要适当地处理空格字符 – srgerg 2011-03-24 00:20:47

+1

是的,这是问题,但我使用一个空间为以下扫描和删除\ nie scanf(“%c %d%d “&OP,和宽度,和高度); 后来 的scanf(” %C%d%d “&OPB,&X,&y); 感谢大家的帮助 – Milk 2011-03-29 01:43:12

0

我认为最简单的将是第二个scanf函数%C之前把空间。如果你没有空间使用它,它将需要第一个符号。这意味着换行符。空间使%c取第一个不是空格或制表符的符号。所以:

scanf(" %c %d %d", &op, &x, &y); 
+0

我不相信” %c“忽略空格。 – 2017-02-21 01:30:36