我正在尝试根据设计规则使用 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
无论 replaceText
和 replaceWith
的长度如何,您都可以替换输入字符串中的子字符串并写入输出缓冲区。但是您必须小心,您的输出缓冲区已经足够大以容纳您的字符串 - 否则您会遇到缓冲区溢出。
关于c - 基于规则的语法检查器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19904690/