【问题标题】:Learning how to parse strings and use structs in C学习如何在 C 中解析字符串和使用结构
【发布时间】:2014-03-06 10:18:28
【问题描述】:

我正在尝试在 C 中处理结构和指针。 我想要完成的是让用户在 main() 中以 DD-MM-YYYY 格式输入日期,然后解析字符串 formatted_date。我已经阅读了一些关于如何做到这一点的建议,但不明白如何应用它。非常感谢任何帮助。 谢谢!

#ifndef DATE_H_
#define DATE_H_

// Define the structure date.
typedef struct {
    int tm_mday;
    int tm_month; 
    int tm_year;
} date;

// Parses a string 'formatted_date' representing a date
// in format DD-MM-YYYY, DD.MM.YYYY or DD/MM/YYYY
// into a structure date 'parsed_date'.
void parse_formatted_date(char * formatted_date, date * parsed_date) {

}

【问题讨论】:

  • 你基本上是在要求一个完整的例子来说明你正在尝试做什么,以及一个关于它做什么和如何做的分步解释。这不是它的工作原理。向我们展示首先尝试了什么,然后告诉我们你读到了什么。你甚至没有向我们展示你是如何调用这个函数的,所以你的date *可能是一个指向堆栈变量的指针,或者一个堆指针......,或者一个空指针,在在这种情况下您的功能将不起作用

标签: c string parsing struct


【解决方案1】:

您可以使用sscanf() 来解析这个格式化的日期字符串,如下所示:

int parse_formatted_date(const char *formatted_date, date *parsed_date) {
    const int ret = sscanf(formatted_date, "%d-%d-%d",
            &parsed_date->tm_mday,
            &parsed_date->tm_month,
            &parsed_date->tm_year);
    return ret == 3;
}

这是完整的测试程序:

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int tm_mday;
    int tm_month; 
    int tm_year;
} date;

int parse_formatted_date(const char *formatted_date, date *parsed_date) {
    const int ret = sscanf(formatted_date, "%d-%d-%d",
            &parsed_date->tm_mday,
            &parsed_date->tm_month,
            &parsed_date->tm_year);
    return ret == 3;
}

int
main(int argc, char *argv[])
{
    date d;

    char *formatted_date = "06-03-2014";
    if (parse_formatted_date(formatted_date, &d))
        printf("date: %s\ndd = %d, mm = %d, yy = %d\n", formatted_date,
                d.tm_mday, d.tm_month, d.tm_year);
    exit(EXIT_SUCCESS);
}

【讨论】:

  • if(bool expression) return true; else return false; 的恐怖而欢呼。只是说。
  • @unwind 同意,这种格式很难看。更新了,这个应该会更好。
  • 谢谢。是的,这更好。 Best (imo) 将是最简单的:return sscanf(...) == 3;。另外,如果使用临时的,它应该是const。 :)
  • @unwind ?: 确实没有必要。但是return sscanf(...) == 3; 也很难缩进看起来不错。顺便说一句,你的意思是ret 应该是const int
  • 是的,我的意思是const int ret = sscanf(...);,它应该是const,因为它在被赋予初始值后不会被改变。我根本没有看到缩进问题,但我想这是偏离主题的。对不起。
猜你喜欢
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-20
  • 1970-01-01
  • 1970-01-01
  • 2012-07-25
  • 1970-01-01
相关资源
最近更新 更多