我想重现终端用户的行为,并尽可能使用scanf
:
当用户仅输入新行时,终端将继续打印目录,直到插入真实命令为止。
插入新行时,函数scanf
的正常行为是保持跳空行等待用户真正插入有效字符。
观察:当我执行./main.out时,此终端模拟正在运行,这意味着我不是在谈论我的OS终端,而是在我的程序中谈论一个用C语言模拟的终端。
scanf
插入空白行时通常会发生什么:
realPC:~/realDirectory$ ./main.out //starting our simulated terminal
pc:~/Desktop$ '\n'
'\n'
'\n'
"COMMAND\n" //PROCESS THE COMMAND!
pc:~/Desktop$ //waiting...
我想要什么:
realPC:~/realDirectory$ ./main.out //starting our simulated terminal
pc:~/Desktop$ '\n'
pc:~/Desktop$ '\n'
pc:~/Desktop$ '\n'
pc:~/Desktop$ "COMMAND\n" //Process the command here
pc:~/Desktop$ //waiting...
此目录仅是一个示例,我想打印任何消息(例如,在空输入后继续打印箭头">>>"
),问题是scanf
似乎根本没有考虑{ {1}}输入,所以我什么也不能打印
我知道'\n'
可以代替scanf,但是我想知道是否可以使用scanf函数(我不习惯fget,我也接受其他解决方案,如果可能)
这是代码(fgets(userInput, 1024, stdin)
不能同时用于两种用途)
scanf
很显然,当我说用户键入int main()
{
char userInput[1024];
char pwd[] = "pc:~/marcospb19"; // Directory that keeps being printed
while (1)
{
printf("%s$ " , pwd); // Print the directory just like terminals do
scanf(" %s" , userInput); // I wanted this to enter the while and keep printing directory
while (userInput[0] == '\n') // Keeps the input inside the loop, if is a new line
{
puts("We're inside this loop! that's good, now keep printing directory...");
printf("%s$ " , pwd); // Directory printed, next: take input again
scanf(" %s" , userInput); // This should be able to receive '\n'.
// This loop should continue if user types '\n'
}
// Now, you can process the input, it isn't empty!
printf("Process the input: %s\n", userInput);
}
}
时,他只是按下Enter键(不是真正地键入)。
答案 0 :(得分:2)
是否可以使用scanf仅检测新行输入?
是
char eol[2];
if (scanf("%1[^n]", eol) == 1) {
puts("Input with just new line");
else {
// read the line via other means
}
scanf()
并尝试读取用户输入的行的问题包括:
"\n"
。"\n"
输入中很难。我不习惯fgets
比编写一些替代方法更好的是,学会使用标准库棚中的最佳工具来读取行。
答案 1 :(得分:1)
scanf
rapidly gets complicated,因为它会将阅读输入与处理输入混合在一起。当您只想阅读一行并对其进行操作时,fgets
更合适。阅读该行,然后根据需要进行处理。您甚至可以使用sscanf
来保留scanf家族。
#include <stdio.h>
#include <string.h>
int main()
{
char userInput[1024];
char pwd[] = "pc:~/marcospb19"; // Directory that keeps being printed
printf("%s$ " , pwd);
while (fgets(userInput, sizeof(userInput), stdin) != NULL)
{
if( strcmp(userInput, "\n") == 0 ) {
puts("Empty input.");
}
else {
puts("Some input");
}
printf("%s$ " , pwd);
}
puts("");
}
这也使您可以进行更复杂的处理,例如查找空白行。
if( strspn(userInput, " \t\r\n") == strlen(userInput) ) {
puts("Blank input.");
}
请注意,fgets
会将换行符留在最后,因此您可能必须先删除userInput
的换行符。