我正在将 Makefile 中的宏定义解析为两个字符串,即宏的名称和正文。例如,这是我的 Makefile 中的宏定义行:
宏1=主体1
我的代码产生总线错误/段错误。
static void parse_macro_def(const char* line)
{
char* m_name;
int name_pos = 0;
int i = 0;
while(line[i++] != '=') //iterate until an equal sign is found
{
if(!isspace(line[i])) //copy characters to m_name unless the character is whitespace
{
m_name[name_pos++] = line[i];
}
}
}
m_name[name_pos] = '\0';
m_name 应设置为 Macro-1 感谢您的帮助!
最佳答案
您没有初始化m_name
,因此它指向任何地方,因此您是随机写入并崩溃。
您需要分配并返回空间,或者传入空间(以及空间的长度),确保在每种情况下都不会覆盖。
<小时/>您应该注意,宏名称中的空格字符是宏定义中的一个错误。可以有前导空白;可以有尾随空白;但名称中间不能有空格。现在,如果您假设您已经获得了一个有效的、有效的 Makefile 来解析,那么您可能可以忽略这个微妙之处。如果您正在编写 make
的替代品,则不能。
除非您之前已经验证过字符串中存在等号,否则您还应该检查是否超出了字符串的末尾(您不会扫描 NUL '\0 '
)。事实上,在健壮的代码中,您可能会出于偏执而确保这一点。
while (line[i] != '\0' && line[i] != '=')
{
...
}
并且,在编写该内容时,我意识到您在 while
条件中递增了 i
,然后检查下一个字符是否是循环体中的空格。我们可以说,这有点不合常规。如果您遇到宏:
MACRO=value
当循环条件检查O
时,您将把=
复制到m_name
中。而且,AFAICS,您不会复制 M
。
请注意您的行:
m_name[name_pos] = '\0';
在任何函数之外,因此是语法错误。
关于C语言编程字符串解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9693623/