1

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

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

4

6 回答 6

4

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

"%d:%d"

"%d :%d"

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

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


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

于 2013-07-18T14:13:44.460 回答
0

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

于 2013-07-18T12:57:37.550 回答
0

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

sscanf( buffer, "%d : %d", &hourInput, &minutesInput )
于 2013-07-18T13:00:13.717 回答
0

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

于 2013-07-18T13:00:18.013 回答
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

于 2013-07-18T13:12:16.667 回答
0

sscanf 手册页上

SSCANF 的返回值-

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

现在,

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

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

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

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

于 2013-07-18T14:16:13.190 回答