在 C 中获取输入后如何不跳到新行

how do i not skip to a new line after getting an input in C

提问人:meghashyaam sagar 提问时间:5/23/2023 最后编辑:Jabberwockymeghashyaam sagar 更新时间:5/24/2023 访问量:124

问:

我试过这个代码

#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.

基本上,我不希望光标在我提供输入后跳过一行。

C 字符串 输入 scanf

评论

4赞 mch 5/23/2023
你打字吗?这就是你之后看到的10<enter>10<newline>Enter a number:
1赞 Jabberwocky 5/23/2023
你不能用标准的方式轻松做到这一点。作为初学者,您不应该打扰。scanf
0赞 mch 5/23/2023
通常终端混合了 stdin 和 stdout(例如,您会看到程序打印的内容和您键入的内容的混合),但一些在线编译器将它们分开: godbolt.org/z/EbT13cqv4 在这里,您可以看到输出在 1 行中,但它错过了您键入的内容。10
0赞 Allan Wind 5/23/2023
默认情况下,stdin 是行缓冲的,因此您需要更改终端以一次向您发送一个字符(例如在 Linux 上)。下一个问题:输入后你怎么知道数字已经完成?您可以使用一次读取一个字符。您可以使用字符串或将字符串转换为数字,也可以编写自己的函数来向现有数字添加数字 (cfmakeraw()0scanf("%c", ...)sscanf()strtol()value = 10 * value + digit)
1赞 Steve Summit 5/23/2023
您在这里遇到的问题是操作系统的终端驱动程序正在回显您键入的所有内容。(如果没有,则在键入它们时看不到 和 。因此,如果您不希望它回显您键入的换行符,则必须关闭所有回显。然后,由于您可能确实希望在键入它们时看到 and,因此对于换行符以外的字符,您将不得不自己进行回显。而且您可能还必须关闭“规范模式”。如果您以前从未使用过终端驱动程序,这将是一个相当大的项目。1010

答:

2赞 Allan Wind 5/23/2023 #1

以下是我上面概述的答案,如果您的终端支持 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()intINT_MININT_MAX

评论

0赞 Allan Wind 5/23/2023
@Jabberwocky完成。广泛支持 ANSI 转义码 (AFAIK)。
0赞 Jabberwocky 5/23/2023
是的,他们是。但它们可能不受支持,您应该明确这一点,因为 OP 是初学者。顺便说一句,您的代码在这里不起作用(Windows 10),但终端应该支持 ANSI 转义序列,不确定发生了什么......
1赞 Allan Wind 5/23/2023
@Jabberwocky 保存/恢复是一个“私人”,我猜这是一个扩展。已将其更改为 DEC 版本。这也适用于这里。\e7\e8
2赞 Lundin 5/23/2023 #2

这并不是真正的编程问题,而是用户/控制台问题。如果用户在键入内容后按回车键,则会在 中添加一个新行字符。stdin

根据操作系统的不同,您可以改为输入 .如何在终端中输入EOF的值。Ctrl+D 或 Ctrl+Z 取决于操作系统。EOF

之后,行为应如下所示:https://godbolt.org/z/88h5MhTzr。请注意,我没有接触过您的代码。

还有其他非标准的控制台 I/O 函数可用于获得您想要的行为,即使用户按回车键,但这并不值得研究,因为控制台 I/O over 非常过时且总体上有问题。没有使用控制台的 GUI 的专业程序倾向于通过命令行参数来获取输入,这更不容易出错且更易于清理。stdin

2赞 Andreas Wenzel 5/23/2023 #3

在大多数平台上,当读取用户输入时,用户的输入将被回显到屏幕上。这包括换行符。stdin

如果要更好地控制输入是否回显到屏幕,则必须使用特定于平台的功能。

例如,在 Microsoft Windows 上,您可以使用 _getch 函数,该函数将读取用户的单次击键而不会回显。然后,您可以让程序仅在该击键满足特定条件(例如,如果它不是换行符)时才将该击键打印到屏幕上。为了获得更大的灵活性,可以使用函数 ReadConsoleInput 而不是 ._getch

在 Linux 上,您可以将 ncurses 库用于相同的目的。