基于规则的语法检查器

时间:2013-11-11 11:01:55

标签: c string

我正在尝试使用基于设计规则的c进行简单的语法检查。如果我想设计一个搜索以元音开头的单词的规则,并确保标识符为'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,所以结果总是错误的。考虑这个例子:

输入:一把伞

输出:mbrella

任何想法如何正确地做到这一点?

2 个答案:

答案 0 :(得分:0)

你需要一个额外的缓冲区来做你想要的 - 因为你的字符串的长度可能会在你的函数内发生变化。我假设你想要输出'一把伞',所以你用'an u'代替'a 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的长度如何,您都可以替换输入字符串中的子字符串并写入输出缓冲区。但是你必须小心,你的输出缓冲区已经足够大了你的字符串 - 否则你会得到一个缓冲区溢出。

答案 1 :(得分:-1)

它工作正常,但你的错误是它如何工作,它不写4个字符,但它用你的字符串覆盖前3个