我正在编写代码来替换所有MACROS及其值。 如果我的宏MAX的值为1000, 在代码中,它必须替换为1000.(我假设一个案例,如果MACROS是一行中的第一个字,那么在那行中我们不会替换MACROS,这种情况我们将以不同的方式处理。 / p>
//Code to replace MACROS BY THEIR VALUES
//line contains the actual one line of the code.
//line is initialized to contain as maximum number of charectos(say 100).
//SrcStr is the macro and destStr is its value.
//This block will be looped for all lines.
char* p;
p = strstr(line,srcStr);
if(p != NULL) //if the srcString is found
{
if(strlen(p) != strlen(line)) //special case
{
if( isalnum(*(p-1)) == 0 && isalnum( *(p+strlen(srcStr)))==0 )
// if the next char and prev char to our macro is not a alphabets or digits
{
/*As answered by medo42 (below)*/
memmove(p+strlen(destStr), p+strlen(srcStr),strlen(p+strlen(srcStr)+1);
memcpy(p,destStr,strlen(destStr));
}
}
else
{/* handle differently*/}
}
由于我第一次使用memmove
和memcopy
,我怀疑上述代码是否稳定且运行正常。
以上代码是否正确? 所有输入情况的上述代码是否稳定?
答案 0 :(得分:2)
我发现至少有三个问题:
sizeof(p)
(例如4),它应该使用strlen(line) - (p + strlen(p) - line)
答案 1 :(得分:1)
if(strlen(p) != strlen(line))
为什么不在这里简单地使用if(p != line)
?这应该是等效的,更容易理解和更快(strlen扫描整个字符串)。
isalnum(...) == 0
可能是个人偏好,但我会将该表达式写为!isalnum(...)
,因为这样更容易理解其含义。
memmove(p+(strlen(destStr)-strlen(srcStr)),p,sizeof(p));
这对我来说不对。它将根据您的指针大小移动多个字符,这没有任何意义,如果srcStr比destStr长,则移动的目标可能是行缓冲区开始之前的位置。如果要移动线的其余部分以调整更改的长度,请尝试以下操作:memmove(p+strlen(destStr), p+strlen(srcStr), strlen(p+strlen(srcStr)+1);
+1对于移动空终止符也很重要。当然,您需要确保行缓冲区实际上提供了足够的空间。