c - 未找到静态字符数组且无法与 strncpy 一起使用?

标签 c string variables static char

char *  function decode time()
{ 

   tm *ptm; //time structure
    static char timeString[STRLEN]; //hold string from asctime()

    ptm = gmtime( (const time_t *)&ltime ); //fill in time structure with ltime

    if(ptm) 
    {

       strncpy(timeString, asctime( ptm ), sizeof(timeString) ); 
//EDIT  
sprintf(test, "Sting is: %s", timeString);


       return timeString;
.
.
} //end function

当我单步执行调试器中的代码时,我可以看到 timeString 的值是:
timeString CXX0017:错误:找不到符号“timeString”

但是,当我从 timeString 中删除工作“static”时,它确实用字符串正确填充,但现在是本地副本并将被销毁。

为什么我无法将此函数中的字符串复制到静态字符数组中?

Visual Studio 6.0 - MFC

谢谢。

编辑 “test”字符串确实包含 timeString 的值。

我想这只是一个调试器问题?但为什么我在调试器监视中看不到静态数组的值?

最佳答案

首先,函数名称应该是 function_decode_time() 不是函数解码时间()

使用本地静态 timeString 将用 '\0' 整个初始化,没有静态则不能保证 如果没有静态,调用上下文中的返回值是未定义的。

strncpy 不会在 timeString 中添加 '\0' 来使用 "sizeof(timeString)",参见定义; 因此您必须添加“\0”,例如:

char * functionDecodeTime()
{
  tm *ptm; /* time structure */
  static char timeString[STRLEN]; /* hold string from asctime() */

  memset( timeString, 0 , sizeof timeString ); /* entire content always is defined ! */

  ptm = gmtime( (const time_t *)&ltime ); //fill in time structure with ltime

  if( ptm )
  {
    strncpy(timeString, asctime( ptm ), sizeof(timeString)-1 );
  }

  return timeString;
}

如果您使用本地静态,您的代码不是可重入/线程安全的。

关于c - 未找到静态字符数组且无法与 strncpy 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3612614/

相关文章:

c - 从包含整数的文件中读取一行

c - K&R 的这个例子有什么问题?

c - 在结构中初始化数组的值

java - 拆分复杂的字符串

javascript - CSS 字符串 – 选择第三个逗号之前的所有内容

c - 错误 : variable-sized object may not be initialized| (C language)

C 右移无法正常工作

string - Julia 中的单引号和双引号

jquery - 如何将 JQuery 变量传递给 Razor?

sql - 在 SQL 中设置可变日期