c - 基于规则的语法检查器

标签 c string

我正在尝试根据设计规则使用 c 语言制作一个简单的语法检查器。如果我想设计 a-an 规则来搜索以元音开头的单词,并确保标识符是“an”而不是“a”。我尝试了以下功能:

void TheFirstRule(char string[])
{
    char *pointer;
    pointer=strstr(string,"a u");
    while(pointer!=NULL)
    {
        strncpy(pointer,"an ",3);
        pointer=strstr(string,"a u");
    }
}

此函数接受一个字符串并搜索出现的“a u”,然后将其替换为“an”。它工作正常,但问题是:它写了 4 个字符而不是 3 个,所以结果总是错误的。考虑这个例子:

输入:一把雨伞

输出:一把雨伞

有什么正确的方法吗?

最佳答案

你需要一个额外的缓冲区来做你想做的事——因为你的字符串的长度可能在你的函数内部发生变化。我假设您想输出“一把雨伞”,所以您将“a u”替换为“an u”以从输入“一把雨伞”中获取它。

以下代码按预期工作:

#include <string.h>
#include <stdio.h>

void TheFirstRule(const char *input, char *output, const char* replaceText, const char* replaceWith){
  size_t pos = 0;
  while(*input != '\0'){
    if(strncmp(input, replaceText, strlen(replaceText)) == 0){
      /* text to be replaced found */
      strcpy(&output[pos], replaceWith);
      pos += strlen(replaceWith);
      input += strlen(replaceText);
    }else{
      output[pos] = *input;
      pos++;
      input++;
    }
  }
  output[pos] = '\0';
}
int main(int argc, char** argv){
  char buffer[256];
  const char text[] = { "a umbrella" };
  TheFirstRule(text, buffer, "a u", "an u");
  printf("%s\n", buffer);
  return 0;
}

输出:

an umbrella

无论 replaceTextreplaceWith 的长度如何,您都可以替换输入字符串中的子字符串并写入输出缓冲区。但是您必须小心,您的输出缓冲区已经足够大以容纳您的字符串 - 否则您会遇到缓冲区溢出。

关于c - 基于规则的语法检查器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19904690/

相关文章:

c++ - 如何在 MFC 对话框按钮上设置管理权限图标?

c# - 如何将 C 数据结构转换为允许您从文件中读取数据类型的 C# 结构?

java - 当在字符串中发现某些数学逻辑时验证括号是否存在

java - 正则表达式根据确切的字符拆分,除非在它之前用反斜杠转义

javascript - match() 函数输入的 TypeScript "type"是什么

java - java中如何处理字节序列?

c - 'C' 中变量和指针的字符串连接

c - 使用结构进行类型转换

在c中将错误代码转换为摩尔斯电码

将 int 与 double 数组进行比较