如何在scanf()函数结束时检测输入是否以空格或换行符结尾?

4

我正在编写一个程序,需要像shell一样从用户接受命令,允许用户设置环境变量的值。 我遇到的问题是,如果用户键入 set var var-value ,我需要知道用户键入了空格而不是只输入了set,然后按下Enter键,这是不同的命令。 我如何使用 scanf() 确定用户是否按下了空格或回车键?


你的问题不够清晰。scanf函数只有在用户按下回车键后才会返回。你是说用户可以在一行上输入“set”,在另一行上输入命令的其余部分吗? - Carey Gregory
scanf()检测到空格时,它不会返回吗? - Slayter
所以如果用户输入 set var var-value,它只将 set 放入传递给 scanf() 的变量中,直到用户按下回车键并结束 var-value 才返回? - Slayter
这将取决于您传递给 scanf 的格式字符串。一般来说,我认为 scanf 不是您想在此处使用的函数。请参见此问题 - Carey Gregory
4个回答

2
你会知道用户按下回车键,因为scanf()不会返回直到用户按下回车键。如果你想在用户输入时实时读取字符,scanf()将无法满足你的需求。你需要使用getchar()getch()getche()函数,或操作系统提供的用于读取键盘输入的函数。逐个字符地读入数组,同时在读取过程中扫描空格和回车键。
另请参阅此问题

getchar()scanf() 一样与 stdin 进行交互。建议将其从备选列表中删除。 - chux - Reinstate Monica

1
你可以使用 ctype.h 中的 isspace() 函数进行检查。
另一种方法是使用 strchr() 查找输入是否包含 '\n' 或空格。
if(strchr(input,'\n')==NULL && strchr(input,' ')==NULL)
{
//do something
}  

编辑

scanf() 会读取输入直到遇到任何一个空格字符,之后会忽略输入。

如果您输入的长度小于 MAXLENGTH,则使用 fgets() 代替 scanf(),'\n' 会停留在 Null 字符之前。

请将其替换为 null 字符。

char input[MAXLENGTH+1];  

fgets(input,sizeof(input),stdin);

if(input[strlen(input)-1]=='\n')     
input[strlen(input)-1]='\0'; 

scanf() 不会将空格或换行符返回到 input 中。 - ngneema
1
但是在大多数情况下,scanf会忽略所有的空格。你需要展示如何防止这种情况发生,以使你的解决方案能够正常工作。 - Carey Gregory
@ngneema和Carey Gregory。添加了更多信息。是的,scanf无法读取空格或回车键后的内容。OP需要使用fgets()代替scanf()。 - Gangadhar

1
我该如何检测scanf()输入的末尾是否有空格或换行符?
使用%width[^\n]读取输入直到'\n'
char buffer[256];
//                  v------- Read and discard leading whitespace
int retval = scanf(" %255[^\n]", buffer);
if (retval != 1) {
  ; // handle error or EOF
}
// Now scan buffer for whatever input format you desire
char ch;
retval = sscanf(buffer, "set%c", &ch);
if ((retval == 1) && (ch == '\n')) {
  ; // deal with "set"
}
else {
  char var[256];
  char value[256];
  retval = sscanf(buffer, "set %s %s", var, value);
  if (retval == 2)  {
    ; // deal with "set var var-value"
  }
  else {
  // other parsings
  }
}

%s[^\n], not %s[\n] - Sebi2020
@Sebi2020 是的,回答已经修改。 - chux - Reinstate Monica

1
您应该使用fgets而不是scanf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接