C语言编程字符串解析

标签 c string parsing segmentation-fault

我正在将 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/

相关文章:

c++ - 是否有用于检测 USB 过流的 Windows API?

获取无符号字符指针长度的正确方法

html - 如何在 Powershell Core 中解析 html

xml - XSD 嵌套元素

c++ - 一条定义规则 : Can corresponding entities have different names?

c - 将字符串指针数组传递给函数并读取字符串的值

javascript - 替换 href 链接文本

C++ 字符串 - 超出范围错误

string - 字符串不可变有什么优势?

parsing - Golang time.Parse() 行为 - 000 时降低精度