2

設計規則に基づいて、c を使用して簡単な文法チェッカーを作成しようとしています。母音で始まる単語を検索し、識別子が「a」ではなく「an」であることを確認する a-an ルールを設計したい場合。私は次の機能を試しました:

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 " に置き換えます。正しく動作しますが、問題は、3 文字ではなく 4 文字を書き込むため、結果が常に間違っていることです。次の例を検討してください。

入力: 傘

出力: 傘

それを正しく行う方法はありますか?

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

長さに関係なく、replaceText入力replaceWith文字列内の部分文字列を置き換えて、出力バッファーに書き込むことができます。ただし、出力バッファーが既に文字列に対して十分な大きさであることに注意する必要があります。そうしないと、バッファー オーバーフローが発生します。

于 2013-11-11T11:43:37.983 に答える