使用C设置文件名的日期和时间

使用C设置文件名的日期和时间,c,time,C,Time,我找到了一个为文件设置日期和时间的示例。谁能解释一下这个循环是什么 for (; *p; ++p) { if (*p == ' ') *p = '_'; } …是什么意思 /* ctime example */ #include <stdio.h> /* printf */ #include <time.h> /* time_t, time, ctime */ int main () {

我找到了一个为文件设置日期和时间的示例。谁能解释一下这个循环是什么

for (; *p; ++p)
{
    if (*p == ' ')
          *p = '_';
}
…是什么意思

/* ctime example */
    #include <stdio.h>      /* printf */
    #include <time.h>       /* time_t, time, ctime */

    int main ()
    {
      time_t rawtime;
      char buffer [255];

      time (&rawtime);
      sprintf(buffer,"/var/log/SA_TEST_%s",ctime(&rawtime) );
    // Lets convert space to _ in

    char *p = buffer;
    for (; *p; ++p)
    {
        if (*p == ' ')
              *p = '_';
    }



      printf("%s",buffer);
      fopen(buffer,"w");

      return 0;
    }
/*ctime示例*/
#包括/*printf*/
#包括/*时间、时间、ctime*/
int main()
{
时间与时间;
字符缓冲区[255];
时间(&rawtime);
sprintf(缓冲区,“/var/log/SA_TEST_%s”,ctime(&rawtime));
//让我们将空间转换为uin
char*p=缓冲区;
对于(;*p;++p)
{
如果(*p=='')
*p='u';
}
printf(“%s”,缓冲区);
fopen(缓冲区,“w”);
返回0;
}

当我执行这个程序时,文件名没有
'
,而是有空的空格,即使程序声明
'
'
替换为

这个循环通过
缓冲区
以下划线替换空格。

说明:

char *p = buffer; // `p` is a pointer to the beginning of `buffer`
for (; *p ; ++p) // Increment `p` to point to the next character, until a `\0` is reached
{
    if (*p == ' ') // Check if the character at pointer `p` is a space
        *p = '_'; // If so, replace it by an underscore
}

如果
p
是指向字符串的指针,则(;*p;++p)
的循环将迭代字符串的字符;请注意,条件
*p
表示“只要
p
当前指向的值不等于0(即字符串终止字符)”,并且
++p
将指针移动到下一个字符。 表达式
if(*p=='')*p='
仅表示“如果当前字符为空,则将其替换为
'


如果您的文件名仍然包含“空格”,则可能这些空格不是
'
,而是其他显示为空格的字符(例如,选项卡
'\t'
)。您可以使用
if(isblank(*p))*p='.'
;您可以添加
if(*p=='\n'){*p=0;break;}
以消除新行并在出现这种情况时截断文件名。

循环将空格转换为下划线,以便文件名不包含空格。但是将
ctime()
的输出用于日期格式是一个可怕的想法。使用ISO 8601样式的日期,例如
2018-03-12.12:34:56
或类似的日期,使用
strftime()
格式化。还要注意,
ctime()
在字符串末尾包含一个换行符;这包含在文件名中——这是一个非常糟糕的想法(它会破坏空白映射所做的任何好事)。看起来对我有用。确切的输出是什么?当我测试代码时,空格被下划线代替。(我将换行符映射为空字节并终止循环,但下划线在此之前已映射。)我还删除了创建文件的行;这个名字看起来并不重要。SA_TEST_Fri Mar 23 18:53:28 2018是输出。在这种情况下,空格不会被下划线取代,那么上面显示的代码与您正在执行的代码不匹配。可能是源代码中有一个不间断的空格,从上面复制时不会显示。我复制了代码,它确实修复了运行macOS 10.13.3(High Sierra)和GCC 7.3.0的Mac上的空格。您使用的是哪种系统?哪个编译器?您是否尝试过将问题文本复制到新文件中,并编译和运行该文件?(我建议删除
fopen()
调用;在试验循环的功能时不需要它。)