1
xdeng 2014-12-13 13:29:13 +08:00 via iPhone 1
字节对齐 或者这个数的附近变量溢出了
|
3
aaaa007cn 2014-12-13 14:02:35 +08:00
> strcpy(tmpb, top(pb));
strcpy 是一直复制到 \0 为止 看看 top(pb) 返回的是什么,它的 \0 到哪里为止? > 另外问题就好像出现在strcpy上面, 把strcpy换成了自己构造的函数过后i值就没有出现异样. 你自己构造的长什么样 |
4
fliar 2014-12-13 14:10:25 +08:00 via iPad 1
你的char数组都很短,string是以/0结尾,scanf应该不会检查越界,尝试从这边下手
|
5
razrlele OP @aaaa007cn
抱歉后来构造的代码在解题报告里面忘记贴上去了~ 这是自己后来构造的函数 void cpycards(char* a, char* b) { a[0] = b[0]; a[1] = b[1]; return ; } 嗯。。。top返回的是一个字符串的地址。。。 在gdb调试的时候确实有好像有发现过top(pb)直接返回了模拟的堆栈里面的所有字符(按道理应该只返回两个字符)。。。 所以应该是在我用strcpy操作字符串不当? |
6
aaaa007cn 2014-12-13 14:17:23 +08:00
那就是 strcpy 越界了啊
因为它要一直拷贝到 top(pb) 的 \0 为止 你这里可以 memcpy(tmpb, top(pb), 2); 像 @fliar 所说,scanf 也一样有越界的问题 不过这个要看你的输入 |
7
razrlele OP |
8
aaaa007cn 2014-12-13 14:38:15 +08:00 1
没出现问题 不等于 没有问题
因为 scanf 出不出问题和你的输入有关 在输入已知的情况下 scanf 的问题更加隐蔽 在 vc 中 scanf 和 strcpy 一样都会报 C4996 警告的 |
9
tomriddle 2014-12-13 15:01:54 +08:00
尽量不要混写C++和C,用C++就要尽量避免使用C函数,如果非要用,也最好封装起来用。
|
10
razrlele OP |
11
tomriddle 2014-12-13 15:19:12 +08:00
@razrlele 比方说 int class = 0; 在C中可以通过编译的,C++就是纯错误了。再比方std::string 无论是本身运算速度和开发效率char*都比不了的。还有如果非要在C++中放入纯C代码,需要用extern "C"来包裹,而且还要放在#ifdefine __cplusplus里面,非常麻烦。我觉得你如果用C++ 和STL来写这些会极大提高速度的,省下来的精力可以多做几道题。只有真正核心算法才去想办法优化。
|
12
razrlele OP |
14
tomriddle 2014-12-13 16:08:40 +08:00
@razrlele 那如果非要纯C的话就尽量代码写统一,避免使用C++。超时的话估计是人家编译器比较老吧。我这几年经验就是开发速度和执行速度一起考虑才是真正的编程语言效率,其实我更推荐用python编这些题目。
|
15
razrlele OP @jiang42
我是看discuss里面说stack很慢, 然后搜的解题报告也没几个用stack的, 我用stack写的代码TLE也可能是我自己哪个地方写错了(我直接给删了所以现在也不知道) 你AC的代码运行时间是多少? |
16
jiang42 2014-12-13 16:37:21 +08:00
@razrlele 我不仅用了stack,还用了vector。。。运行了2.03
代码链接在这: https://github.com/jiang42/AlgoContest/blob/master/uva/uva127.cpp |