提问人:meghashyaam sagar 提问时间:5/23/2023 最后编辑:Jabberwockymeghashyaam sagar 更新时间:5/24/2023 访问量:124
在 C 中获取输入后如何不跳到新行
how do i not skip to a new line after getting an input in C
问:
我试过这个代码
#include <stdio.h>
int main() {
int num;
printf("Enter a number: ");
scanf("%d", &num);
printf("You entered: %d. Next, let's print on the same line: ", num);
printf("This is the output on the same line.\n");
return 0;
}
我的输出是这样的:
Enter a number: 10
You entered: 10. Next, let's print on the same line: This is the output on the same line.
但是我想要这个输出:
Enter a number: 10You entered: 10. Next, let's print on the same line: This is the output on the same line.
基本上,我不希望光标在我提供输入后跳过一行。
答:
以下是我上面概述的答案,如果您的终端支持 ANSI 转义码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define CSI "\033["
#define FORWARD "C"
#define RESTORE "\0338"
#define SAVE "\0337"
#define str(s) str2(s)
#define str2(s) #s
#define STR_LEN 10 // int(log10(INT_MAX))
int main() {
char str[STR_LEN+1];
printf("Enter a number: ");
printf("%s", SAVE);
scanf("%" str(STR_LEN) "[^\n]", str);
printf("%s%zu%s", RESTORE CSI, strlen(str), FORWARD);
char *p;
int num = strtol(str, &p, 10);
printf("You entered: %d. Next, let's print on the same line: ", num);
printf("This is the output on the same line.\n");
}
这是预期的输出:
Enter a number: 10You entered: 10. Next, let's print on the same line: This is the output on the same line.
我可能不会使用它。例如,如果您输入多行输入,您最终会在屏幕上看到杂散数据。
您应该检查返回值 from 并进一步确保该值与 (即 和 之间)拟合。strtol()
int
INT_MIN
INT_MAX
评论
\e7
\e8
这并不是真正的编程问题,而是用户/控制台问题。如果用户在键入内容后按回车键,则会在 中添加一个新行字符。stdin
根据操作系统的不同,您可以改为输入 .如何在终端中输入EOF的值。Ctrl+D 或 Ctrl+Z 取决于操作系统。EOF
之后,行为应如下所示:https://godbolt.org/z/88h5MhTzr。请注意,我没有接触过您的代码。
还有其他非标准的控制台 I/O 函数可用于获得您想要的行为,即使用户按回车键,但这并不值得研究,因为控制台 I/O over 非常过时且总体上有问题。没有使用控制台的 GUI 的专业程序倾向于通过命令行参数来获取输入,这更不容易出错且更易于清理。stdin
在大多数平台上,当读取用户输入时,用户的输入将被回显到屏幕上。这包括换行符。stdin
如果要更好地控制输入是否回显到屏幕,则必须使用特定于平台的功能。
例如,在 Microsoft Windows 上,您可以使用 _getch
函数,该函数将读取用户的单次击键而不会回显。然后,您可以让程序仅在该击键满足特定条件(例如,如果它不是换行符)时才将该击键打印到屏幕上。为了获得更大的灵活性,可以使用函数 ReadConsoleInput
而不是 ._getch
在 Linux 上,您可以将 ncurses 库用于相同的目的。
评论
10<enter>
10<newline>
Enter a number:
scanf
10
cfmakeraw()
0
scanf("%c", ...)
sscanf()
strtol()
value = 10 * value + digit
)1
0
1
0