如何在打印语句中间从用户那里获取输入
How to take input from user in the middle of print statement
#include <stdio.h>
int main()
{
int r;
printf("radius is : cm");
scanf("%d",&r);
printf(" radius is %d cm",r);
}
这是我写的代码,正在打印 radius is : cm (input)
但我希望 PC 将其打印为
radius is : (input) cm
我尝试在扫描语句之后再使用一个打印语句,但是 cm
在用户输入后打印出来。
如何从打印语句的句子之间获取输入?
没有简单的好方法来做到这一点。首选方法是深入研究像 ncurses
这样的库,但我认为使用它对于这个问题来说有点过头了。
“有效”但会被认为是不好的做法并且肯定会带来缺点的一件事是简单地打印退格字符。
printf("radius is : cm\b\b\b\b\b\b\b");
scanf("%d",&r);
这将使“cm”保持在固定位置,但您可以用输入覆盖它,然后它就不会回来了。如果您希望它在您输入更多字符时移动,那么您需要做一些(很多)工作。
如果您的目标是明确单位,请考虑使用不同的措辞来输入。像“以厘米为单位输入半径:”或“半径(厘米):”或类似的东西。
这是一个示例,说明如果您希望“cm”在您键入时来回浮动,则需要执行哪些操作。请注意,这不能保证有效。这取决于您要打印到的控制台。
void clearline() {
printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
printf(" ");
printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
}
int main()
{
int ch;
char buf[200] = {0};
int index = 0;
printf("Enter radius: cm\b\b\b");
while((ch = getchar()) != EOF && ch != '\n') {
if(ch == '\b' && index != 0) buf[--index] = 0;
buf[index++] = ch;
clearline();
printf("Enter radius: %s cm", buf);
fflush(stdout);
}
int r = atoi(buf);
printf(" radius is %d cm", r);
}
编辑:当我在家里尝试时,上面的方法不起作用。我记得我确实设法修复了一些有用的东西,但我不记得是怎么做到的。但是,它很好地说明了它需要什么。
如果没有终端库,这真的无法干净地完成,但是您可以通过在“:”和“cm”之间添加空格并在行尾打印退格键以将光标推回来接近:
#include <stdio.h>
int main()
{
int r;
printf("radius is : cm\b\b\b\b\b\b\b\b");
scanf("%d",&r);
printf(" radius is %d cm",r);
}
输出:
radius is : cm
^
|--cursor is here
需要注意的是,如果您键入的字符多于预期,它们将覆盖“cm”。
#include <stdio.h>
int main()
{
int r;
printf("radius is : cm");
scanf("%d",&r);
printf(" radius is %d cm",r);
}
这是我写的代码,正在打印 radius is : cm (input)
但我希望 PC 将其打印为
radius is : (input) cm
我尝试在扫描语句之后再使用一个打印语句,但是 cm
在用户输入后打印出来。
如何从打印语句的句子之间获取输入?
没有简单的好方法来做到这一点。首选方法是深入研究像 ncurses
这样的库,但我认为使用它对于这个问题来说有点过头了。
“有效”但会被认为是不好的做法并且肯定会带来缺点的一件事是简单地打印退格字符。
printf("radius is : cm\b\b\b\b\b\b\b");
scanf("%d",&r);
这将使“cm”保持在固定位置,但您可以用输入覆盖它,然后它就不会回来了。如果您希望它在您输入更多字符时移动,那么您需要做一些(很多)工作。
如果您的目标是明确单位,请考虑使用不同的措辞来输入。像“以厘米为单位输入半径:”或“半径(厘米):”或类似的东西。
这是一个示例,说明如果您希望“cm”在您键入时来回浮动,则需要执行哪些操作。请注意,这不能保证有效。这取决于您要打印到的控制台。
void clearline() {
printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
printf(" ");
printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
}
int main()
{
int ch;
char buf[200] = {0};
int index = 0;
printf("Enter radius: cm\b\b\b");
while((ch = getchar()) != EOF && ch != '\n') {
if(ch == '\b' && index != 0) buf[--index] = 0;
buf[index++] = ch;
clearline();
printf("Enter radius: %s cm", buf);
fflush(stdout);
}
int r = atoi(buf);
printf(" radius is %d cm", r);
}
编辑:当我在家里尝试时,上面的方法不起作用。我记得我确实设法修复了一些有用的东西,但我不记得是怎么做到的。但是,它很好地说明了它需要什么。
如果没有终端库,这真的无法干净地完成,但是您可以通过在“:”和“cm”之间添加空格并在行尾打印退格键以将光标推回来接近:
#include <stdio.h>
int main()
{
int r;
printf("radius is : cm\b\b\b\b\b\b\b\b");
scanf("%d",&r);
printf(" radius is %d cm",r);
}
输出:
radius is : cm
^
|--cursor is here
需要注意的是,如果您键入的字符多于预期,它们将覆盖“cm”。