4

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

4

4 回答 4

2

你会知道用户按下了回车,因为scanf()在用户这样做之前不会返回。如果您尝试在用户键入时实时读取字符,scanf()则对您不起作用。您将需要使用getchar()getch()getche()函数或操作系统提供的函数来读取键盘输入。将字符一个一个读入一个数组,在阅读时扫描空格和回车键。

另请参阅此问题

于 2013-09-24T18:48:48.737 回答
1

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

另一种方法可以使用strchr()来查找输入是否包含 '\n' 或空格

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

编辑

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

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

用空字符替换它

char input[MAXLENGTH+1];  

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

if(input[strlen(input)-1]=='\n')     
input[strlen(input)-1]='\0'; 
于 2013-09-24T18:48:29.950 回答
1

你会使用fgets而不是scanf

于 2013-09-24T18:50:21.843 回答
1

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

用于%width[^\n]读取最多 a 的输入'\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
  }
}
于 2013-09-24T19:27:18.893 回答