-1

これは、namesafe( char *in) と呼ばれる基本的な C99 関数がどこかにないのはなぜだろうと思うタスクの 1 つです。これは完璧な世界ではいいことですが、UTF-8 ヘブライ語またはおそらくギリシャ語で書かれた名前にはまったく役に立ちません。ただし、7ビットASCIIで立ち往生していると仮定して、次のことを試しました:

  /* We may even go so far as to ensure that any apostrophe, or hyphen
   * or period may only appear as single entities and not as two or three
   * in a row.  This does not, however, protect us from total non-sense
   * such as D'Archy Mc'Clo.u. d.
   *
   * walk the first_name string and throw away everything that is 
   * not in the range A-Z or a-z, with the exception of space char which
   * we keep. Also a single hyphen is allowed. 
   * 
   * This all seems smart but we are not protected from stupidity such
   * As a name with spaces and dashes or hypens intermixed with letters
   * or from the artist formally known as 'Prince'. 
   */
    char buffer[256];
    j = 0;
    for ( k=0; k<strlen(first_name); k++ ) {

        /* Accept anything in the a - z letters */
        if ( ( first_name[k] >= 'a' ) && ( first_name[k] <= 'z' ) )
            buffer[j++] = first_name[k];

        /* Accept anything in the A - Z letters */
        if ( ( first_name[k] >= 'A' ) && ( first_name[k] <= 'Z' ) )
            buffer[j++] = first_name[k];

        /* reduce double dashes or hyphens to a single hyphen */
        while (( first_name[k] == '-' ) && ( first_name[k+1] == '-' ))
            k++;
        if ( first_name[k] == '-' )  /* do I need this ? */
            buffer[j++] = first_name[k];

        /* reduce double spaces to a single space */
        while (( first_name[k] == ' ' ) && ( first_name[k+1] == ' ' ))
            k++;
        if ( first_name[k] == ' ' )   /* do I also need this ? */
            buffer[j++] = first_name[k];

    }
    /* we may still yet have terminating spaces or hyphens on buffer */
    while ( ( j > 1 ) && (( buffer[j-1] == ' ' ) || ( buffer[j-1] == '-' )) )
        j--;
    buffer[j] = '\0';

    /* Accept this new cleaner First Name */
    strcpy ( first_name, buffer );

入力名バッファーの長さが 255 文字を超えない限り、十分に機能するようです。ただし、最初のパスでは、ダッシュとハイフン、場合によってはアポストロフィの混合物のような先頭のスペースとノイズを取り除く方法を知りたいですか?

それで問題は...どうすればこれをより良くすることができますか?また、if ( first_name[k] == '-' )とスペースについても同じように尋ねる行が必要ですか? 重複を探してバッファをたどったところ、ハイフンまたは単一のスペースに着陸する必要があります。右?

4

1 に答える 1

1

コードをクリーンアップする方法の抽象的なプログラミングの問題として純粋に見るとisalpha()、バッファにアルファベットの文字、単一のハイフン、および単一のスペースのみが含まれていることを確認するために使用できます。

for (k = 0; k < strlen(first_name); k++) {

   if (isalpha (first_name[k])
       buffer [j++] = first_name[k++];

   else if (( first_name[k] == '-' ) && (isalpha (first_name [k+1])))
       buffer [j++] = first_name[k++];

   else if (( first_name[k] == ' ' ) && (isalpha (first_name [k+1])))
       buffer [j++] = first_name[k++];

   else
       k++;
}

これは単なるドラフトです。私は実際にこれを試していないので、保証はありません。また、"John - Paul" のように、ハイフンの前後にスペースを入れて書き出す場合も正しく処理されません。単一のハイフンではなく、単一のスペースになります。そのようなエッジケースをキャッチしたい場合は、おそらくいくつかの追加の「else」句を入れることができます。

とはいえ、具体的な現実世界の解決策として、名前を入力されたとおりに扱う方がよいことに同意します。私は変わった名前を持っていますが、人々に、はい、これは本当に私の名前であり、いいえ、受け入れられる名前のアイデアに合わせて変更することはできません.

于 2013-08-07T00:56:28.900 に答える