返回信息流rt,thx
这是一条镜像帖。来源:北邮人论坛 / cpp / #79879同步于 2014/5/23
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
[求助]如何把string类型的数据写到一个char数组里去
NM999
2014/5/23镜像同步13 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
整个字符串。
【 在 NM999 的大作中提到: 】
: 还有一个问题,如果定义一个字符串数组,然后定义一个字符指针p指着字符串的首地址,那么cout《p是出来一个字符还是整个字符串呢,请问
又是M$的“优雅”嘛- -|strncpy伤不起...
#define N 10
string src = "abcdefgh";
char dest[N];
memset(dest, 0, N);
strncpy(dest, src.c_str(), (N - 1 < src.length())? (N - 1) : src.length());
cout << dest << endl;
【 在 gaoweiwei 的大作中提到: 】
: std::string src;
: char dest[N];
: strcpy_s(dest, N, src.c_str());
漏掉了最后的'\0'。
不考虑可移植性的话,strncpy的效率不高,起码得先获得源字符串的长度
【 在 tonyjansan 的大作中提到: 】
: 又是M$的“优雅”嘛- -|strncpy伤不起...
: #define N 10
: string src = "abcdefgh";
: ...................
哎~算了~我就不多说啥了,上个源码,对比参考以供学习:
// M$ ***cpy_s
_FUNC_PROLOGUE
errno_t __cdecl _FUNC_NAME(_CHAR *_DEST, size_t _SIZE, const _CHAR *_SRC)
{
_CHAR *p;
size_t available;
/* validation section */
_VALIDATE_STRING(_DEST, _SIZE); // 1
_VALIDATE_POINTER_RESET_STRING(_SRC, _DEST, _SIZE); // 2
p = _DEST;
available = _SIZE;
while ((*p++ = *_SRC++) != 0 && --available > 0) /* 3. copy string */
{
}
if (available == 0)
{
_RESET_STRING(_DEST, _SIZE); // 4
_RETURN_BUFFER_TOO_SMALL(_DEST, _SIZE);
}
_FILL_STRING(_DEST, _SIZE, _SIZE - available + 1); /* 5. pad out with zeroes */
_RETURN_NO_ERROR;
}
// strncpy
char * __cdecl strncpy (char * dest, const char * source, size_t count)
{
char *start = dest;
while (count && (*dest++ = *source++)) /* 3. copy string */
count--;
if (count) /* 5. pad out with zeroes */
while (--count)
*dest++ = '\0';
return(start);
}
【 在 gaoweiwei 的大作中提到: 】
: 漏掉了最后的'\0'。
: 不考虑可移植性的话,strncpy的效率不高,起码得先获得源字符串的长度