2016-07-21 11 views
2

このコードは10番目と11番目の文字を ''と '@'としてn = 11を返します これはどのように機能しますか? strlen関数はどのようにして11文字にしますか?いくつかのコンパイラでは、文字列の長さが12文字になるようです。 Cヌル文字のない文字列のstrlenはどのように計算されますか?

#include <stdio.h> 
#include <string.h> 

void fun(char *arr) 
{ 
    int i; 
    unsigned int n = strlen(arr); 
    printf("n = %d\n", n); 
    for (i=0; i<n; i++) 
    printf("%c ", arr[i]); 
} 

int main() 
{ 
    char arr[] = {'g', 'e', 'e', 'k', 's', 'q', 'u', 'i', 'z'}; 
    fun(arr); 
    return 0; 
} 
+9

未定義の動作 - ここでは、segフォルトまたは非終了を含む何かが発生する可能性があります。 –

+0

"geeksquiz"定数の終わりの後のどこかにnul文字があるとします。読み込み専用のデータセグメントに他の値を与えるロジックがあるかもしれませんが(念頭に置く必要はありません)、確かにあなたが頼りにするものではありません。 – Rup

+1

"ヌル文字のない文字列" **は文字列ではありません** – pmg

答えて

3

、 "string" は末尾にNUL文字を持っています。 char[]NULでなければ、 "文字列"ではなくchar[]である。

Cの配列の長さはどこにも格納されていないので、strlen()NULと同じ長さになります。アレイが終了した後、メモリセル数がNULになるのは幸いです。

+1

'NUL'と' NULL'は同じではありません。 「NUL」、「\ 0」、「0」、「ヌル文字」は同じです。 – alk

8

標準によると、 "文字列"にはヌルターミネーターがないため、これは文字列ではありません。文字列以外のものと一緒にstrlenを呼び出すと、未定義の動作になります。したがって、あなたが観察しているケースも含めて何かが起こる可能性があります。

これはどういうことが起こっているのでしょうか。これはおそらくstrlenがヌルターミネーターを見つけようとしているからであり、ときどきarrの後のどこかのメモリで見つけます。

ヌルターミネータが「十分に速く」見つからない場合は、このコードをセグメントすることもできます。

valgrindのようなツールを使用して、このようなメモリアクセス違反を検出できます。

0

文字列を初期化するときはいつでも、コンパイラはnul演算子\0を自動的に追加します。例えば、あなたのコードでやろうとしていることは、文字配列の作成だけですが、" "を使用し、ユーザからの文字列の入力を求めるときにコンパイラが自動的に\0をあなたに追加します。しかし、確かにあなたが文字列の単語を単語で分割してポインタの配列で保存しようとしているときに、nul演算子を自分で追加する必要がある場合があります。char *str[20]次に、追加する必要があります\0最後に。そして、あなたはstrlen()機能に満足できない場合は、このように自分自身をコーディングすることができます

size_t count = 0; 
while (str != '\0'){  //str is the string name 
count++; 
} 

ありがとうございました!

+0

Cでは "*' nul'演算子* "はありません。おそらく、' 0'-ターミネーター、別名ヌルターミネーター、別名 'NUL'-ターミネーターを意味します。 – alk

+0

もう一度本を開いて改訂することをお勧めします。 'NULL'はポインタのためのもので、コンパイラはグローバルポインタに値を割り当てます。あなた自身で割り当てる必要があるローカルポインタのためにあります。また、あなたが本を開いて読み込むと、' nul'ターミネータが文字列の一部です文字列であれば、この用語と '\ 0'と呼ばれるものが何であるかを知ることができます。まあありがとう、ええ、0は数字です、そのターミネーターではありません。@alk –

+0

'NUL'は値 '' \ 0 ''が値 '0'に等しい文字の名前です。 C-文字列を終了するために使用されます。これらは、NULLポインタ値 "NULL"とは何も関係ありません。少なくともCではそうではありません。さまざまな 'L/l'の異なる数と大文字に注意してください。私はCスタンダードをここにお勧めします:http://port70.net/~nsz/c/c11/n1570.html – alk

関連する問題