【问题标题】:How can I detect a space or newline at the end of scanf()?如何在 scanf() 末尾检测空格或换行符?
【发布时间】:2013-09-24 18:37:49
【问题描述】:

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

【问题讨论】:

  • 您的问题不清楚。 scanf 函数在用户按下回车之前甚至不会返回。你是说用户可以在一行输入set,在另一行输入命令的其余部分?
  • scanf() 检测到空格时不返回吗?
  • 所以如果用户输入set var var-value,它只会将set放入传递给scanf()的变量中,但直到用户按下回车时var-value结束才返回?
  • 这取决于您传递给scanf 的格式字符串。一般来说,我不认为scanf 是您要在这里使用的功能。见this question

标签: c io newline scanf space


【解决方案1】:

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

另见this question

【讨论】:

  • getchar()stdin 交互,如scanf()。建议将其从替代列表中删除。
【解决方案2】:

您将使用fgets 而不是scanf

【讨论】:

    【解决方案3】:

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

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

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

    编辑

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

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

    用空字符替换它

    char input[MAXLENGTH+1];  
    
    fgets(input,sizeof(input),stdin);
    
    if(input[strlen(input)-1]=='\n')     
    input[strlen(input)-1]='\0'; 
    

    【讨论】:

    • scanf() 不会将空格或换行符返回到input
    • scanf 在大多数情况下会删除所有空格。您需要展示如何防止这种情况发生才能使您的解决方案发挥作用。
    • @ngneema 和 Carey Gregory。添加了更多信息。是的,scanf 不会在空格或返回键后读取。 OP 需要使用 fgets() 而不是 scanf()。
    【解决方案4】:

    如何检测 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],不是%s[\n]
    • @Sebi2020 是的,答案已修改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-20
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    • 2015-11-01
    相关资源
    最近更新 更多