70,020
社区成员




char tbuf[4] = {0};
char buf[1024] = {0};
strncpy(buf, "\n", 2);
strncat(buf, _itoa(1, tbuf, 10), 3);
strncat(buf, ":", 2);
strncat(buf, _itoa(2, tbuf, 10), 3);
strncat(buf, ":", 2);
strncat(buf, _itoa(3, tbuf, 10), 3);
strncat(buf, "\n", 2);
std::cout << buf<< std::endl; //1:2:3
strncat(strncat(strncat(strncat(strncat(strncat(
strncpy(buf, "\n", 2),
_itoa(1, tbuf, 10), 3),
":", 2),
_itoa(2, tbuf, 10), 3),
":", 2),
_itoa(3, tbuf, 10), 3),
"\n", 2);
std::cout << buf<< std::endl; //1:1:1
char tbuf[4] = {0};
char buf[1024] = {0};
strncat(buf, _itoa(1, tbuf, 10), 3);
strncat(buf, _itoa(2, tbuf, 10), 3);
buf[0] = 0;
strncat(strncat(buf, _itoa(1, tbuf, 10), 3), _itoa(2, tbuf, 10), 3);
没问题的代码就不讨论了,
单单来看strncat(strncat(buf, _itoa(1, tbuf, 10), 3), _itoa(2, tbuf, 10), 3);这句。
我没有看debugger的执行过程,但从过去看的经验,以及由此建立的对函数调用的理解,要执行这句,先是最外层的strncat压参,而且是从右向左压的,所以是:
先入3,
为了压第二个参数,先执行了_itoa(2, tbuf, 10),返回tbuf压参,同时tbuf的内容是2
为了压第一个参数,要执行strncat(buf, _itoa(1, tbuf, 10), 3),即内部的strncat,
为了执行内部的strncat,同样也是先压3,
再执行_itoa(1, tbuf, 10),这时返回tbuf,但是tbuf的内容已经是1了
压buf
此时内部strncat完成调用,返回buf,压参
然后外部strncat开始调用。
至此,可以清楚错误在哪里了。
LZ可以自行用debugger跟踪此过程,对比顺序调用的过程。
简言之,就是压参,调用,返回这样一个递归的过程(即要算什么,必须先算什么,这样一个依赖)。
最后一句话,不要过早优化。
int n=1, m=2, k=3;
char buffer[1024];
snprintf(buffer, 1024, "%d:%d:%d", n, m, k);
char buf[1024] = {0};
char tbuf[4] = {0};
char tbuf2[4] = {0};
char tbuf3[4] = {0};
strncat(strncat(strncat(strncat(strncat(strncat(
strncpy(buf, "\n", 2),
_itoa(1, tbuf, 10), 3),
":", 2),
_itoa(2, tbuf2, 10), 3),
":", 2),
_itoa(3, tbuf3, 10), 3),
"\n", 2);
std::cout << buf<< std::endl; //1:2:3
第二种中把用于int转char*的tbuf,改成3个就可以了。。。
搞不懂究竟是怎样执行的呢?按理说应该和第一种一样的执行才对吧
是这样的,我感觉问题就是出在用于转换的tbuf上了