我正在编写一个程序,需要像shell一样从用户接受命令,允许用户设置环境变量的值。 我遇到的问题是,如果用户键入 set var var-value
,我需要知道用户键入了空格而不是只输入了set
,然后按下Enter键,这是不同的命令。 我如何使用 scanf()
确定用户是否按下了空格或回车键?
scanf()
不会返回直到用户按下回车键。如果你想在用户输入时实时读取字符,scanf()
将无法满足你的需求。你需要使用getchar()
、getch()
或getche()
函数,或操作系统提供的用于读取键盘输入的函数。逐个字符地读入数组,同时在读取过程中扫描空格和回车键。getchar()
与 scanf()
一样与 stdin
进行交互。建议将其从备选列表中删除。 - chux - Reinstate Monicaif(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
中。 - ngneemascanf
会忽略所有的空格。你需要展示如何防止这种情况发生,以使你的解决方案能够正常工作。 - Carey Gregory%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]
- Sebi2020fgets
而不是scanf
。
scanf
函数只有在用户按下回车键后才会返回。你是说用户可以在一行上输入“set”,在另一行上输入命令的其余部分吗? - Carey Gregoryscanf()
检测到空格时,它不会返回吗? - Slayterset var var-value
,它只将set
放入传递给scanf()
的变量中,直到用户按下回车键并结束var-value
才返回? - Slayterscanf
的格式字符串。一般来说,我认为scanf
不是您想在此处使用的函数。请参见此问题。 - Carey Gregory