C 为什么我没有得到正确的输出

C 为什么我没有得到正确的输出,c,C,我正在写一段代码,要求以p0xy的格式获得两个特定的点。 如果用户键入Q,则程序终止,由于某种原因,我无法将用户输入(p0xy)输出到输出中。当我尝试运行代码并键入p023时,它表示我选择了点023.00 而所需的输出是p023 #include <stdio.h> void main() { float a, b; char Q, P, input; printf(""); scanf("%c", &input); if (in

我正在写一段代码,要求以
p0xy
的格式获得两个特定的点。 如果用户键入
Q
,则程序终止,由于某种原因,我无法将用户输入(
p0xy
)输出到输出中。当我尝试运行代码并键入
p023
时,它表示我选择了点
023.00

而所需的输出是
p023

#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);
}
#包括
void main(){
浮子a、b;
字符Q,P,输入;
printf(“”);
scanf(“%c”,&input);
如果(输入='Q'){
printf(“退出计划”);
返回(0);
}否则{
scanf(“%c”“%f”“%f”“,&input,&a,&b);
printf(“您选择了点:%c%f%f”,输入,a,b);
}
返回(0);
}

因为您使用了两个
scanf
。首先
scanf
读取
P
,然后从命令行(从
stdin
)读取
0
。所以在第二次
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;
}
#包括
int main()
{
浮子a、b;
字符Q,P,输入;
字符点[3]={'\0'};
scanf(“%c”,&input);
点[0]=输入;
如果(输入=='Q')
{
printf(“退出计划”);
返回0;
}
其他的
{
scanf(“%c”“%f”“%f”“,&input,&a,&b);
点[1]=输入;
printf(“您选择了点:%s%f%f”,点a、点b);
}
返回0;
}

另一个答案也提到,当检查输入中的
Q
时,输入字节被消耗。C标准库为这个特定的问题提供了一个解决方案:您可以将消耗的字节“返回”到输入设备(键盘缓冲区),然后重试从输入读取

该功能是
ungect
。它需要非常具体的语法(您应该“unget”与刚才读取的值相同的值;您还必须使用
stdin
来指定您正在使用键盘),并且只适用于一个字节,完全符合您的需要

这是你的代码和我的更新和评论

#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;
}
#包括
int main()
{
浮子a、b;
char Q;//仅用于检查“退出”条件
字符输入[10];//假设9个字符+终止字节就足够了
scanf(“%c”和“&Q”);
如果(Q=='Q')
{
printf(“退出计划”);
返回(0);
}
其他的
{
ungetc(Q,stdin);//向输入设备返回一个字节
scanf(“%s”“%f”“%f”,input,&a,&b);//“%s”现在以字符串形式从输入中读取
printf(“您选择了点:%s%f%f”,输入,a,b);
}
返回0;
}

什么是重定向输入?抱歉,我对编程非常陌生。字符串以空字符(
\0
)结尾。我只是通过填充空字符来初始化字符串。你不需要像我一样初始化数组,但是你必须在字符串的末尾添加空字符。好的,我现在知道了,有没有办法合并多个输入,但是如果按Q,它会退出程序?我尝试了多个if-else语句,do-while,甚至switch-and-break,但对我不起作用。一个程序的流控制在开始时似乎很棘手:/n您可以使用
ungetc(Q,stdin)
作为@anatolygOr的答案,您可以输入字符串,然后将该字符串的第一个字符与
Q
进行比较。另外,
ungetc
很好。一个UV供您使用。
%s
->
%9s
可防止无效输入上的潜在缓冲区溢出。您还应该测试第一个
scanf()
返回1,第二个
scanf
返回3。