【问题标题】:Taking formatted input : sscanf not ignoring white spaces采用格式化输入:sscanf 不忽略空格
【发布时间】:2013-07-18 12:54:42
【问题描述】:

在接受表单用户的输入后,我必须找出输入的小时数和分钟数:

( Number1 : Number2 ) 

例如:(12:21)

我应该报告 12 小时 21 分钟,然后再次等待输入。如果给定格式不匹配,我应该将其报告为无效输入。我写了这段代码:

#include<stdio.h>
int main()
{
    int hourInput=0,minutesInput=0; 
    char *buffer = NULL;
    size_t size;

    do
    {
        puts("\nEnter current time : ");
        getline ( &buffer, &size, stdin );

        if ( 2 == sscanf( buffer, "%d:%d", &hourInput, &minutesInput ) && hourInput >= 0 && hourInput <= 24 && minutesInput >=0 && minutesInput <= 60  )
        {

            printf("Time is : %d Hours %d Minutes", hourInput, minutesInput );
        }

        else
        {
            puts("\nInvalid Input");
        }   
    }

    while ( buffer!=NULL && buffer[0] != '\n' );

    return 0;
}

问。如果有人在数字和: 之间给出了空格,我的程序将其视为无效输入,而我应将其视为有效。

有人可以解释为什么会发生这种情况以及摆脱这个问题的任何想法吗?据我了解, sscanf 应该忽略所有空格?

【问题讨论】:

  • 顺便说一句:您在 hourInput 中接受“24”,这对于“24:00”很有用。您也接受分钟“60”。推荐“minutesInput
  • @chux 感谢您指出这一点。不过,我在此处发布后已对其进行了更正。
  • 您是否愿意接受 24:00(最好参见 ISO 8601)但不接受 24:01,您可以使用 ... &amp;&amp; hourInput &gt;= 0 &amp;&amp; minutesInput &gt;=0 &amp;&amp; minutesInput &lt; 60 &amp;&amp; ((hourInput*60 + minutesInput) &lt;= 24*60)

标签: c scanf formatted-input


【解决方案1】:

要在 ':' 之前允许可选空格,请替换

"%d:%d"

"%d :%d"

sscanf() 忽略其格式指令告诉它忽略的空白,而不是所有地方。指令中的空格字符,例如 ' ' 将忽略所有空格。 %d 以及其他整数和浮点指令将忽略前导空格。因此%d 之前的空格是多余的。

C11 7,21,6,2,8 输入空白字符(由 isspace 函数指定)被跳过,除非规范包含 [、c 或 n 说明符。)


其他注意事项包括使用%uunsigned 作为不接受负数的替代方法。 strptime() 是用于扫描字符串以获取时间信息的常用函数。

【讨论】:

    【解决方案2】:

    我认为,如果您在冒号前后放置一个空格,它将忽略任何空格,并且当他们不在冒号前后放置空格时仍然可以工作。 像这样:

    sscanf( buffer, "%d : %d", &hourInput, &minutesInput )
    

    【讨论】:

      【解决方案3】:

      使用 "%d : %d" 作为格式字符串。它可以在有和没有空格的情况下使用。

      【讨论】:

        【解决方案4】:

        在使用buffer之前分配内存的第一件事

        第二个是C++ 程序还是C,因为getline 不是C standard 函数。

        检查一下

        int main()
        {
                int x=0,y=0;
                char bff[]="7        8";
                sscanf(bff,"%d%d",&x,&y);
                printf("%d %d",x,y);
        }
        

        o/p-7 8

        【讨论】:

        • 1.内存由 getline 分配。 2. 它被标记为 C. 3. (12 foo,bar 32) 在这种情况下也可以工作,它不应该。
        【解决方案5】:

        开启sscanf man pagez

        SSCANF 的返回值 -

        这些函数返回分配的输入项的数量。这个可以 是 在匹配失败的情况下,比规定的要少,甚至为零 是的。零表示,尽管有可用的输入,但没有转换 sions被分配;这通常是由于输入字符无效, 例如用于 '%d' 转换的字母字符。 EOF 的值为 如果在任何转换(例如结束)之前发生输入失败,则返回 文件外发生。如果转换后发生错误或文件结尾 开始时,成功完成的转换次数为 返回。

        现在,

        如果有人在数字和 : 之间给出空格,我的程序认为 它作为无效输入

        是的,它应该认为它是错误的,因为sscanfbuffer中读取的方式与%d:%d完全相同,但是如果输入流中的字符与格式字符串冲突,则函数结束,以匹配失败结束。

        转换规范之外的字符应与输入流中的字符序列匹配; 输入流中匹配的字符被扫描但不存储。请看粗体句子的重点

        sscanf 写入内存时会忽略空格。

        【讨论】:

          【解决方案6】:

          避免比较sscanf() 返回值。在您的情况下,它始终取决于用户输入。如果用户在输入之间给出空格,则此值会更改。

          【讨论】:

          • sscanf() 不依赖于 char 数组,scanf() 不依赖于用户输入吗?
          猜你喜欢
          • 2016-07-09
          • 2023-03-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-14
          • 1970-01-01
          相关资源
          最近更新 更多