21

私はこの関数をCで記述しました。これは、文字列を介して次の非空白文字まで反復することを目的としています。

char * iterate_through_whitespace(unsigned char * i){
    while(*i && *(i++) <= 32);
    return i-1;
}

非常にうまく機能しているように見え*iますが、その状況でがfalseと評価され*i == '\0'、文字列の終わりを超えて繰り返されないと想定しても安全かどうか疑問に思います。私のコンピューターではうまく機能しますが、他のマシンでコンパイルした場合も同じように動作するのではないかと思います。

4

4 に答える 4

15

標準は言う:

ヌル文字と呼ばれる、すべてのビットが0に設定されたバイトは、基本実行文字セットに存在する必要があります。文字列を終了するために使用されます。

于 2011-09-25T22:57:36.640 に答える
14

はい-しかし、私の意見では、より明確にする方が良いスタイルです:

while (*i != '\0' && ...

しかし、との比較32はほとんど最善のアプローチではありません。 32たまたまスペース文字のASCII/Unicodeコードですが、Cは特定の文字セットを保証しません。また、空白ではない値が32未満の制御文字がたくさんあります。

関数を使用しisspace()ます。

(そして、私は決してポインタに名前を付けませんi。)

于 2011-09-25T22:58:03.057 に答える
3

Cでは'\0'、とまったく同じ値とタイプがあり0ます。'\0'コードを醜くする以外に書く理由はありません。\0ただし、nullバイトが埋め込まれた文字列を作成するには、二重引用符で囲むと便利な場合があります。

于 2011-09-26T00:28:32.240 に答える
0

ASCII標準では、NUL文字がバイトとしてエンコードされることが規定されています0。ASCIIとの下位互換性のあるエンコーディングでの作業をやめない限り、何も問題はありません。

于 2011-09-25T22:59:08.047 に答える