我正在尝试使用基于设计规则的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
任何想法如何正确地做到这一点?
答案 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
无论replaceText
和replaceWith
的长度如何,您都可以替换输入字符串中的子字符串并写入输出缓冲区。但是你必须小心,你的输出缓冲区已经足够大了你的字符串 - 否则你会得到一个缓冲区溢出。
答案 1 :(得分:-1)
它工作正常,但你的错误是它如何工作,它不写4个字符,但它用你的字符串覆盖前3个