【问题标题】:How did this code work这段代码是如何工作的
【发布时间】:2014-05-10 01:34:19
【问题描述】:
char *My_Time(FILE *prnt) 
{
  time_t raw_Time = time(0);
  struct tm *info;
  char myt_Time[80];

  info = localtime(&raw_Time);
  return asctime(info);// Returns the time i want 
}

int Crte_acclg (FILE *crte_Fp1)
{
  char *my_Currtime;
  my_Currtime = My_Time(crte_Fp1);    // succesfully stores the time i want without having a array of chars?
  fprintf(crte_Fp1,"File Created: %s",my_Currtime);
  return 1;
}

所以在上面的代码中,我要求我的时间返回当前时间,并将它存储在一个 char * 中。我的问题是这行代码是如何工作的,因为我正在取回一串字符,那么为什么当我指向一个字符位置时它能够给我完整的字符串?

【问题讨论】:

  • 字符串是以\0结尾的字符数组。在 C++ 中还有一个 string 类。
  • 你得到的是一个指向字符串第一个字符的指针。当您打印一个字符串时,该函数会对该字符串进行迭代,直到找到\0
  • 您是说Crte_acclg 中的fprintf 调用不输出完整的时间/日期字符串吗?你怎么知道,你怎么检查?如果您在程序运行时检查文件,则可能是输出尚未刷新到实际文件中。
  • @Joachim Pileborg 不,他混淆了charchar*
  • @JoachimPileborg 确实如此,但因为 asctime ( info) 是一个字符串,编译器会在内存中排列数据,因此将 * 传递到 char 的末尾,可以让我阅读所有存储的字符?

标签: c arrays char return


【解决方案1】:

字符串的种类很多,标准的C字符串是sentinel值为0的序列。

返回的char*指向这个序列,相当于指向它的第一个元素。

asctime() 可以安全地返回这个指针,因为它使用了一个足够大的内部静态缓冲区,并且您承诺使用它永远不会同时使用它,也不会在调用另一个允许的标准函数后依赖返回值使用这个缓冲区。

除此之外:最好获取标准的C99 with Technical corrigenda TC1, TC2, and TC3 included(从维基百科复制的链接)。

【讨论】:

    【解决方案2】:

    字符串只不过是内存中某处的一系列字符。当你有一个指向字符串的指针时,它指向字符串中的第一个字符。

    假设我们有一个这样的字符串:

    char someString[] = "Hello world";
    

    在内存中是这样的:

    +-----------------+ | "你好世界\0" | +-----------------+

    现在当你有一个指向这个字符串的指针时

    char *pointerToString = someString;
    

    会是这样的

    +-----------------+ +-----------------+ |指针字符串 | --> | "你好世界\0" | +-----------------+ +-----------------+

    asctime 函数有一个类似于我上面示例中的someString 的数组。该数组被声明为static,这意味着一旦函数返回它就不会超出范围。随着数组衰减为指针,这意味着当asctime 返回数组时,它将变成指向该数组中第一个字符的指针,并且您可以看到和使用该指针。

    【讨论】:

      猜你喜欢
      • 2011-05-16
      • 1970-01-01
      • 1970-01-01
      • 2017-04-09
      • 2018-06-03
      • 2013-12-05
      • 1970-01-01
      相关资源
      最近更新 更多