70,040
社区成员
发帖
与我相关
我的任务
分享
理解和讨论之前请先学会如何观察!
多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程!
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步Debug版对应汇编一行!
单步Debug版对应汇编千行不如单步Release版对应汇编一行!
不会单步Release版对应汇编?在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有,然后在IDE中运行。(一般人我不告诉他!
)
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
char* csTrim_v2(char* cs)
{
char* ret = cs;
char* pc = new char[strlen(cs) + 1];
int pos = strspn(cs , "\t \n"); // 查找非空白处pos
strcpy(pc , cs + pos);
char* end = pc;
while (*end++) // 找到字符串末位的'\0',
; // 因为上面 end++,实际指针在 '\0'的后一个
end -= 2; // 所以退2格,回到字符串最后一个字母
while (*end == ' ' || *end == '\t' || *end == '\n') {
*end-- = '\0';
}
strcpy(cs , pc);
delete[] pc;
return ret;
}
char* cs_strrev(char* string)
{
char* start = string;
char* left = string;
char ch;
while (*string++) // 找到string 末位的'\0',
; // 因为上面 string++,实际指针在 '\0'的后一个
string -= 2; // 所以退2格,回到字符串最后一个字母
while (left < string) {
ch = *left; // 通过临时变量 ch 进行交换
*left++ = *string;
*string-- = ch;
}
return(start);
}
使用 while 可以把代码写的简短。
/*-----------------------------------------------*/
使用 for 可以方便表示一个区间 遍历
// iterate foo: inserting into bar
for (auto it = std::begin(foo); it!=std::end(foo); ++it)
bar.push_back(*it);
// iterate bar: print contents:
std::cout << "bar contains:";
for (auto it = std::begin(bar); it!=std::end(bar); ++it)
std::cout << ' ' << *it;
std::cout << '\n';