これは、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] == '-' )とスペースについても同じように尋ねる行が必要ですか? 重複を探してバッファをたどったところ、ハイフンまたは単一のスペースに着陸する必要があります。右?