我正在编写一段代码,要求使用P0 x y
格式的两个特定点。
如果用户键入Q
,则程序会终止,由于某种原因,我无法将用户输入(P0 x y
)输出到输出中。当我尝试运行代码并键入P0 2 3
时,它表示我已选择点0 2.00 3.00
。
所需的输出为P0 2 3
。
#include <stdio.h>
void main() {
float a, b;
char Q, P, input;
printf("");
scanf("%c", &input);
if (input == 'Q') {
printf("quitting program");
return (0);
} else {
scanf("%c" "%f" "%f", &input, &a, &b);
printf("you have chose points: %c %f %f", input, a, b);
}
return (0);
}
答案 0 :(得分:1)
因为您使用两个scanf
。首先scanf
读P
,然后第二scanf
从命令行(来自0
)读stdin
。因此,第二scanf
,input = '0'
之后。这就是您的程序打印0 2.00 3.00
如果要打印出P0
,则必须使用字符串,例如下面的示例:
#include <stdio.h>
int main()
{
float a, b;
char Q, P, input;
char point[3] = {'\0'};
scanf( "%c" , &input);
point[0] = input;
if(input=='Q')
{
printf("quitting program");
return 0;
}
else
{
scanf( "%c" "%f" "%f", &input, &a, &b);
point[1] = input;
printf("you have chose points: %s %f %f",point, a, b);
}
return 0;
}
答案 1 :(得分:1)
另一个答案也提到,当检查输入中的Q
时,将消耗输入字节。 C标准库提供了针对此特定问题的修复程序:您可以将消耗的字节“返回”到输入设备(键盘缓冲区),然后重试从输入读取。
函数为ungetc
。它需要非常特定的语法(您应该“弄钝”与刚刚读取的值相同;还必须使用stdin
来指定您正在使用键盘),并且只需要一个字节就可以了。 / p>
这是您的代码以及我的更新和评论。
#include <stdio.h>
int main()
{
float a, b;
char Q; // only used for checking the "quit" condition
char input[10]; // assuming 9 characters + terminating byte is enough
scanf("%c", &Q);
if(Q=='Q')
{
printf("quitting program");
return (0);
}
else
{
ungetc(Q, stdin); // return one byte to the input device
scanf( "%s" "%f" "%f", input, &a, &b); // "%s" read from the input as string now
printf("you have chose points: %s %f %f",input, a, b);
}
return 0;
}
答案 2 :(得分:0)
您在代码上的一些观察:
main
返回void,但是您返回整数。else
的{{1}}分支表示“不是if
” 。此不一定表示“它是Q
” 。P
之后是一个数字。对我来说,您的格式如下:
P
WHAT_FOLLOWS INDEX LIST_OF_NUMBERS
(一个字符)例如可以是: WHAT_FOLLOWS
代表点,P
代表矩形,R
代表圆形。< / li>
C
(一个整数)可以是应该在其中存储数字的数组中的位置。INDEX
(浮点数)是描述形状的数字。A solution :
LIST_OF_NUMBERS