采用格式化输入:sscanf不忽略空格

时间:2013-07-18 12:54:43

标签: c scanf formatted-input

我必须在从表单用户那里获取输入后找出输入的小时和分钟:

( 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;
}

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

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

6 个答案:

答案 0 :(得分:4)

要在&#39;之前允许可选空格:&#39;,请替换

"%d:%d"

"%d :%d"

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

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


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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

使用“%d:%d”作为格式字符串。它可以使用和不使用空格。

答案 4 :(得分:0)

在使用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

答案 5 :(得分:0)

sscanf man pagez

返回SSCANF的值 -

  

这些函数返回分配的输入项数。这个可以   是        如果匹配失败,则少于提供的数量,甚至为零        URE。零表示虽然有可用的输入,但没有收敛 -        分配了sions;通常这是由于输入字符无效,        例如'%d'转换的字母字符。值EOF是        如果在任何转换(如结束)之前发生输入故障,则返回        发生了文件。如果转换后发生错误或文件结束        开始时,成功完成的转换次数是        返回。

现在,

  

如果有人在号码和:之间留出空格,我的程序会考虑   它作为无效输入

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

转换规范之外的字符应与输入流中的字符序列匹配; 输入流中匹配的字符会被扫描但不会被存储。请注意以粗体显示的句子

,即写入内存时sscanf忽略空格。