如何在scanf()的末尾检测空格或换行符?
我正在编写一个程序,在这个程序中,我必须接受来自用户的命令,就像一个shell,用户可以在其中设置环境变量的值。我遇到的问题是,如果用户键入如何在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
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()
。建议将其从备选方案列表中删除。