2

我正在尝试根据设计规则使用 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 个,所以结果总是错误的。考虑这个例子:

输入:一把雨伞

输出:一把伞

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

4

2 回答 2

0

你需要一个额外的缓冲区来做你想做的事——因为你的字符串的长度可能在你的函数内部发生变化。我假设您想输出“伞”,因此您将“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都可以替换输入字符串中的子字符串并写入输出缓冲区。但是您必须注意,您的输出缓冲区已经足够大以容纳您的字符串 - 否则您会得到缓冲区溢出。

于 2013-11-11T11:43:37.983 回答
-1

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

于 2013-11-11T11:10:15.733 回答