【问题标题】:Check a user-entered string is of format "%d/%d/%d/%d/%d" in C [closed]检查用户输入的字符串在 C 中的格式为“%d/%d/%d/%d/%d” [关闭]
【发布时间】:2024-01-11 00:20:01
【问题描述】:

我尝试使用sscanf() 检查字符串的格式。即使它与格式不匹配,它也不会打印错误。我不知道它有什么问题。

char        *now = 1; // assume this is the user-entered string
int         year,month,hour,min,sec;

//CHECKING IF THE ARGUMENT IS CORRECT OR NOT
if (sscanf(now,"%d/%d/%d/%d/%d\n",&year,&month,&hour,&min,&sec) == 0)   
    {
        fprintf(stderr,"\x1b[1;31mMust specify correct format\nExiting........\x1b[0m\n");
        _exit(1);   
    }

【问题讨论】:

  • 我不确定您希望char *now = 1 做什么。您是否打算将指针初始化为 1?
  • ...或者,在最后一条评论的支持下,检查EOF per this sscanf documentation
  • @ryyker 是的。假设像 char *now = 2000/300/2。它应该给出一个错误,因为它不是格式 %d/%d/%d/%d/%d
  • char *now = 2000/300/2 不是合法的初始化。尼特是:char *now = 1;。可以char *now = "2000/300/2"
  • sscanf() 返回成功分配的字段数(或 EOF 错误)...

标签: c linux format scanf


【解决方案1】:

sscanf 返回成功扫描和分配的字段数(或EOF,以防出错)。您正在检查 %ds 是否没有成功,即没有从字符串中解析出数字。这意味着即使可以解析一个整数,if 也不会执行。所以改变

if (sscanf(now,"%d/%d/%d/%d/%d\n",&year,&month,&hour,&min,&sec) == 0)

if (sscanf(now, "%d/%d/%d/%d/%d", &year, &month, &hour, &min, &sec) != 5)

即使无法解析一个数字,它也会执行if。我删除了\n,因为它在这里没有任何作用。

【讨论】:

    最近更新 更多