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



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

( 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应该忽略所有的空白?

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

"%d:%d"

带有

"%d :%d"

sscanf()忽略其格式指令要求其忽略的空白,而不是所有空白。指令中的空白字符(如' ')将忽略所有空白。%d以及其他整数和浮点指令将忽略前导空白。因此,CCD_ 5之前的空间是多余的。

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


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

我认为,如果在冒号前后放一个空格,它将忽略任何空格,并且在冒号前后不放空格的情况下仍然有效。像这样:

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

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

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

在sscanf man pagez 上

SSCANF的返回值-

这些函数返回分配的输入项目数。这个可以是在匹配失败的情况下,少于所提供的,甚至为零-嗯。零表示,尽管有可用的输入,但没有转换器-分配了sions;通常这是由于无效的输入字符,例如用于"%d"转换的字母字符。EOF值为如果在任何转换(如结束)之前发生输入故障,则返回-文件的。如果在转换后出现错误或文件结尾已开始,成功完成的转换数为返回。

现在,

如果有人在数字和之间加空格,我的程序会考虑作为无效输入

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

转换规范之外的字符应与输入流中的字符序列相匹配扫描输入流中匹配的字符,但不存储请参阅粗体中句子的重点)

sscanf在写入存储器时忽略空白。

避免比较sscanf()返回值。在您的情况下,它总是取决于用户输入。如果用户在输入之间留有空格,则该值会更改。

最新更新