【发布时间】:2012-04-16 05:36:31
【问题描述】:
请有人帮我理解下面程序中的这些代码行 这个程序根据作者写了一串hello world然后里面有一个函数也将字符串反转为world hello,我的任务是这段代码做什么?
char * p_divs = divs; //what does divs do
char tmp;
while(tmp = *p_divs++)
if (tmp == c) return 1
;
还有这段代码在 void 函数中
*dest = '\0';//what does this pointer do?
int source_len = strlen(source); //what is source
if (source_len == 0) return;
char * p_source = source + source_len - 1;
char * p_dest = dest;
while(p_source >= source){
while((p_source >= source) && (inDiv(*p_source, divs))) p_source--;
这是主程序
#include <stdio.h>
#include <string.h>
int inDiv(char c, char * divs){
char * p_divs = divs;
char tmp;
while(tmp = *p_divs++)
if (tmp == c) return 1;
return 0;
}
void reverse(char * source, char * dest, char * divs){
*dest = '\0';
int source_len = strlen(source);
if (source_len == 0) return;
char * p_source = source + source_len - 1;
char * p_dest = dest;
while(p_source >= source){
while((p_source >= source) && (inDiv(*p_source, divs))) p_source--;
if (p_source < source) break;
char * w_end = p_source;
while((p_source >= source) && (!inDiv(*p_source, divs))) p_source--;
char * w_beg = p_source + 1;
for(char * p = w_beg; p <= w_end; p++) *p_dest++ = *p;
*p_dest++ = ' ';
}
*p_dest = '\0';
}
#define MAS_SIZE 100
int main(){
char source[MAS_SIZE], dest[MAS_SIZE], divs[MAS_SIZE];
printf("String : "); gets(source);
printf("Dividers : "); gets(divs);
reverse(source, dest, divs);
printf("Reversed string : %s", dest);
return 0;
}
【问题讨论】:
-
"我的任务是这段代码有什么作用?"鉴于它使用
gets,答案是:它的存在会危及您的系统。至少在 IMO 中,让某人分析这段代码就像给某人一桶 5 加仑的污水,然后问它是从哪里来的。代码是一个丑陋的混乱。如果你想知道如何做它应该做的任务,你应该直接问,所以有人可以解释一个体面的方法来做。这段代码应该被忽略,除非(也许)作为要避免的事情的例子。 -
@JerryCoffin:哇,这太苛刻了。我见过很多更糟糕的代码。
-
@MichaelBurr:我也见过更糟糕的情况,但是要阅读单词并反向打印,这仍然是一个糟糕的起点。从头开始会更容易理解任务。
-
@JerryCoffin:我不知道——它基本上从源字符串的末尾开始,找到单词并将它们复制到 dest——非常简单,总的来说,大多数 C 程序可能如何接近问题。代码肯定存在问题,但除了在缓冲区开始之外递减指针的技术 UB(很多生产代码也可以避免),乍一看,它似乎确实有效并且是相对错误的-免费。
-
@Jerry:这个特殊的疏忽可以相当容易地纠正——为什么不建议修复而不是把婴儿和洗澡水一起扔掉呢?该代码与 C 课程的其他代码相同。如果您要批评,请提供替代方案,我们可以看到您碰巧喜欢的简洁/优雅/性能折衷......会有一些。
标签: c