如何在scanf()的末尾检测空格或换行符?

如何在scanf()的末尾检测空格或换行符?,c,io,newline,scanf,space,C,Io,Newline,Scanf,Space,我正在编写一个程序,在这个程序中,我必须接受来自用户的命令,就像一个shell,用户可以在其中设置环境变量的值。我遇到的问题是,如果用户键入set var value我需要知道用户键入了一个空格,而不仅仅是set,然后按enter键,这是一个不同的命令。如何使用scanf()确定用户是否按下空格键或输入?您可以使用ctype.h中的函数进行检查 您可以使用另一种方法来查找输入是由“\n”还是由空格组成 if(strchr(input,'\n')==NULL && strchr(i

我正在编写一个程序,在这个程序中,我必须接受来自用户的命令,就像一个shell,用户可以在其中设置环境变量的值。我遇到的问题是,如果用户键入
set var value
我需要知道用户键入了一个空格,而不仅仅是
set
,然后按enter键,这是一个不同的命令。如何使用
scanf()
确定用户是否按下空格键或输入?

您可以使用ctype.h中的函数进行检查

您可以使用另一种方法来查找输入是由“\n”还是由空格组成

if(strchr(input,'\n')==NULL && strchr(input,' ')==NULL)
{
//do something
}  
编辑

scanf()读取输入,直到出现任何空白字符。空格后忽略输入

使用而不是scanf() 如果输入的长度小于MAXLENGTH,
'\n'
将保留在空字符之前

将其替换为空字符

char input[MAXLENGTH+1];  

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

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

您将知道用户按了enter键,因为在用户执行此操作之前,
scanf()
不会返回。如果您试图在用户键入字符时实时读取字符,
scanf()
将不适用于您。您需要使用
getchar()
getch()
getche()
函数,或操作系统提供的读取键盘输入的函数。将字符逐个读取到数组中,在读取时扫描空格和enter键


另请参见。

您将使用
fgets
而不是
scanf

如何在scanf()的末尾检测空格或换行符

使用
%[\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
  }
}

你的问题不清楚。在用户按下enter键之前,
scanf
功能甚至不会返回。您是说用户可以在一行上输入
set
,在另一行上输入命令的其余部分吗?
scanf()
在检测到空格时不会返回吗?因此,如果用户输入
set var value
,它只会将
set
放入传递给
scanf()的变量中
但在用户按enter键时,直到
var value
结束时才返回?这取决于传递给
scanf
的格式字符串。一般来说,我不认为
scanf
是您想要在这里使用的函数。请参阅。
scanf()
不会将空格或换行符返回到
input
中,但在大多数情况下
scanf
会删除所有空格。你需要展示如何防止这种情况发生,这样你的解决方案才能发挥作用。@Ngnema和Carey Gregory。添加了更多信息。是的,scanf在空格或返回键后不会读取。OP需要使用fgets()而不是scanf()。
getchar()
stdin
交互,就像
scanf()
。建议将其从备选方案列表中删除。