C中结构的子字符串

C中结构的子字符串,c,C,我的项目中的所有文件名都具有标准格式: NNNN-YYYYMMDD-HHMM.ext 当我使用文件名中的日期和时间元素时,我可以直接从结构中提取它们 现有结构: struct linux_dirent { long d_ino; off_t d_off; unsigned short d_reclen; unsigned char d_type; char d_name[]; // null-termina

我的项目中的所有文件名都具有标准格式: NNNN-YYYYMMDD-HHMM.ext

当我使用文件名中的日期和时间元素时,我可以直接从结构中提取它们

现有结构:

struct linux_dirent {
   long           d_ino;
   off_t          d_off;
   unsigned short d_reclen;
   unsigned char  d_type;
   char           d_name[]; // null-terminated filename
};
此伪代码显示了我想要实现的目标:

...
   char           d_name[]; {
       char           d_name_date[5, 8];  // would return YYYYMMDD
       char           d_name_time[14, 4]; // would return HHMM
   }
};
我可以通过在结构中使用函数来实现这一点,但这是一种冗长的方法。 从主程序的名称中获取日期和时间元素很简单,但我想知道是否在结构中缺少了一个简单的替代方法

多谢各位

如果我这样做:

...
   char           d_name[5];
   char           d_date[9];
   char           d_time[];
}
d_name返回完整文件名:Cam1-20160131-0530.ima
d_日期返回20160131-0530。ima
d_时间返回0530。ima

这些结果与预期的一样,因为每个项都显示为以同一空终止符终止的字符串。

那么,您可以复制结构中的完整字符串,并在
-
所在的位置写入零

注意:要清楚,如果您这样做:

struct myStruct {
   char           d_name[5];
   char           d_date[9];
   char           d_time[9];
}
…通常它会工作,但不能保证编译器不会在结构成员之间添加填充字节,在这种情况下,您将无法获得预期的结果。即使没有填充,也可以在该结构中写入完整字符串。
在真正的代码中,这当然不值得冒险

那么,您可以复制结构中的完整字符串,并在
-
所在的位置写入零

注意:要清楚,如果您这样做:

struct myStruct {
   char           d_name[5];
   char           d_date[9];
   char           d_time[9];
}
…通常它会工作,但不能保证编译器不会在结构成员之间添加填充字节,在这种情况下,您将无法获得预期的结果。即使没有填充,也可以在该结构中写入完整字符串。
在真正的代码中,这当然不值得冒险

我认为这在
C
中是不可能的。您唯一的选择是使用函数提取、设置或打印(或任何其他您需要的操作)主字符串的每个部分


事实上,字符串必须以null结尾,因此,不能在同一位置使用字符串和子字符串:如果不修改主字符串,子字符串不能以null结尾。

我认为在
C
中是不可能的。您唯一的选择是使用函数提取、设置或打印(或任何其他您需要的操作)主字符串的每个部分



事实上,字符串必须以null结尾,因此,不能将字符串和子字符串放在同一位置:在不修改主字符串的情况下,子字符串不能以null结尾。

问题到底出在哪里?这是简单的字符串操作。如果我很了解你想要什么,你想在结构中有3个成员,其中2个直接自动指向第一个的子部分,就在分配第一个时?一种
联合
但在内存的特定部分?所以当你更改其中一个文件时,其他文件会被自动修改?@Michael Walz正如我所说的,从文件名中获取日期/时间很简单,但我很想知道我是否错过了一个简单的替代方案,直接从结构中获取结果。@Garf365是的,没错that@anita2R我认为空终止符会给正确识别每个子字符串带来一些麻烦。其次,您尝试使用未定义的行为:您使用缓冲区溢出自动分配第二个和第三个字段=>它在这里工作,但不确定在其他任何地方!问题到底出在哪里?这是简单的字符串操作。如果我很了解你想要什么,你想在结构中有3个成员,其中2个直接自动指向第一个的子部分,就在分配第一个时?一种
联合
但在内存的特定部分?所以当你更改其中一个文件时,其他文件会被自动修改?@Michael Walz正如我所说的,从文件名中获取日期/时间很简单,但我很想知道我是否错过了一个简单的替代方案,直接从结构中获取结果。@Garf365是的,没错that@anita2R我认为空终止符会给正确识别每个子字符串带来一些麻烦。其次,您尝试使用未定义的行为:您使用缓冲区溢出自动分配第二个和第三个字段=>它在这里工作,但不确定在其他任何地方!读取完整文件名后,将null写回文件名会使两个子字符串返回日期/时间组件。这是一个解决方案,但不是我想要的。我认为手动写入零是强制性的。否则就不能将字符串分开。有趣的问题是法律和UB之间的界限。这是一个危险的赌注。正如你所说的,通常是工作,但它仍然是UB,只是改变编译器的优化级别,它可以为C++提供软盘,它是UB,对于C来说,它是所有的代码> char < /代码>我不确定,可以避免使用Union(仍然不值得)。将null写回文件名会使两个子字符串返回日期/时间组件。这是一个解决方案,但不是我想要的。我认为手动写入零是强制性的。否则就不能将字符串分开。有趣的问题是法律和UB之间的界限。这是一个危险的赌注。正如你所说的,通常是工作,但它仍然是UB,只是改变编译器的优化级别,它可以为C++提供软盘,它是UB,对于C来说,它是所有的代码> char < /代码>我不确定,可以避免使用UB的UB(无论如何还是不值得)。