59

次のコードを検討してください。

char str[] = "Hello\0";

str配列の長さはどれくらいですか、そしてそれはどのくらいの0で終わりますか?

4

7 に答える 7

105

sizeof str「Hello」テキストの場合は7〜5バイト、明示的なNULターミネータ、および暗黙的なNULターミネータです。

strlen(str)は5です-5つの「Hello」バイトのみ。

ここで重要なのは、文字列リテラルがたまたま。で終わっていても、暗黙のnulターミネータが常に追加されること\0です。もちろん、strlen最初に停止するだけです\0-違いはわかりません。

暗黙のNULターミネータルールには1つの例外があります。配列サイズを明示的に指定すると、文字列は次のように切り捨てられます。

char str[6] = "Hello\0"; // strlen(str) = 5, sizeof(str) = 6 (with one NUL)
char str[7] = "Hello\0"; // strlen(str) = 5, sizeof(str) = 7 (with two NULs)
char str[8] = "Hello\0"; // strlen(str) = 5, sizeof(str) = 8 (with three NULs per C99 6.7.8.21)

ただし、これが役立つことはめったになく、文字列の長さを誤って計算して、文字列が終了しない傾向があります。C++でも禁止されています。

于 2011-01-17T09:05:30.483 に答える
12

配列の長さは7で、NUL文字\0は引き続き文字としてカウントされ、文字列は暗黙的に終了します。\0

実用的な例を見るには、このリンクを参照してください

暗黙のNULは、収まる場合にのみ追加されるため(この例では収まらない)、長さが6になると宣言strしたことに注意してください。char str[6]= "Hello\0";

§6.7.8/p14
文字タイプの配列は、オプションで中括弧で囲まれた文字列リテラルによって初期化できます。文字列リテラルの連続する文字(スペースがある場合、または配列のサイズが不明な場合の終了ヌル文字を含む)は、配列の要素を初期化します。

char str[] = "Hello\0"; /* sizeof == 7, Explicit + Implicit NUL */
char str[5]= "Hello\0"; /* sizeof == 5, str is "Hello" with no NUL (no longer a C-string, just an array of char). This may trigger compiler warning */
char str[6]= "Hello\0"; /* sizeof == 6, Explicit NUL only */
char str[7]= "Hello\0"; /* sizeof == 7, Explicit + Implicit NUL */
char str[8]= "Hello\0"; /* sizeof == 8, Explicit + two Implicit NUL */
于 2011-01-17T09:03:47.953 に答える
6

具体的には、混乱する可能性のある1つの状況について説明します。

「\0」と「」の違いは何ですか?

答えは"\0"、配列で表すはis{0 0}""isであるということです{0}

"\0"はまだ文字列リテラルであり、最後に追加されるため"\0"です。そして""空ですが、も追加し"\0"ます。

これを理解すると、深く理解するのに役立ちます"\0"

于 2015-10-28T07:13:59.757 に答える
5

JUST TRY ITのいつものドラムソロを叩いて、将来そのような質問に答える方法は次のとおりです。

$ cat junk.c
#include <stdio.h>

char* string = "Hello\0";

int main(int argv, char** argc)
{
    printf("-->%s<--\n", string);
}
$ gcc -S junk.c
$ cat junk.s

...不要な部分を排除する..。

.LC0:
    .string "Hello"
    .string ""

..。

.LC1:
    .string "-->%s<--\n"

..。

ここで、printfに使用した"-->%s<---\n"文字列が、グローバル文字列が2つの部分に分かれているのに注意してください:"Hello"""。GNUアセンブラも暗黙のNUL文字で文字列を終了するため、最初の文字列(.LC0)がこれらの2つの部分にあるという事実は、2つNULのsがあることを示しています。したがって、文字列の長さは7バイトです。一般に、コンパイラが特定のコードの塊で何をしているのかを本当に知りたい場合は、このようなダミーの例でそれを分離し、それが何を使用しているかを確認してください-S(GNUの場合-MSVCにはアセンブラ出力用のフラグもありますが、私はしません手元にないことを知っています)。コードがどのように機能するか(または場合によっては機能しない)について多くのことを学び、作業しているツールと環境に100%一致することが100%保証された答えをすばやく得ることができます。

于 2011-01-17T09:21:58.963 に答える
3

str配列の長さはどれくらいですか、そしてそれはどのくらいの0で終わりますか?

確認してみましょう:

int main() {
  char str[] = "Hello\0";
  int length = sizeof str / sizeof str[0];
  // "sizeof array" is the bytes for the whole array (must use a real array, not
  // a pointer), divide by "sizeof array[0]" (sometimes sizeof *array is used)
  // to get the number of items in the array
  printf("array length: %d\n", length);
  printf("last 3 bytes: %02x %02x %02x\n",
         str[length - 3], str[length - 2], str[length - 1]);
  return 0;
}
于 2011-01-17T09:48:14.547 に答える
0
char str[]= "Hello\0";

これは7バイトになります。

メモリ内では次のようになります。

48 65 6C 6C 6F 00 00
H  e  l  l  o  \0 \0

編集:

  • C文字列の\0記号はどういう意味ですか?
    これは文字列の「終わり」です。ヌル文字。メモリ内では、実際にはゼロです。これがメッセージの終わりであるため、通常、char配列を処理する関数はこの文字を探します。最後に例を挙げます。

  • str配列の長さはどれくらいですか?(編集部分の前に回答)
    7

  • そして、それはどのくらいの0で終了しますか?
    配列には、ゼロの2つの「スペース」があります。str [5] = str [6] ='\ 0'= 0

追加の例:
そのテキスト配列のコンテンツを出力する関数があると仮定しましょう。次のように定義できます。

char str[40];

これで、その配列の内容を変更して(方法の詳細については説明しません)、「これは単なる印刷テストです」というメッセージが含まれるようにすることができます。メモリには、次のようなものが必要です。

54 68 69 73 20 69 73 20 6a 75 73 74 20 61 20 70 72 69 6e 74
69 6e 67 20 74 65 73 74 00 00 00 00 00 00 00 00 00 00 00 00

したがって、そのchar配列を出力します。そして、あなたは新しいメッセージが欲しいです。「こんにちは」とだけ言いましょう

48 65 6c 6c 6f 00 73 20 6a 75 73 74 20 61 20 70 72 69 6e 74
69 6e 67 20 74 65 73 74 00 00 00 00 00 00 00 00 00 00 00 00

str[5]の00に注意してください。これにより、ベクトルとコンテンツ全体の実際の経度に関係なく、印刷関数は実際に送信する必要がある量を知ることができます。

于 2018-11-08T20:23:16.163 に答える
0

'\ 0'は、NULL文字またはNULLターミネータと呼ばれます 。何も参照しないため、整数0(ゼロ)に相当する文字です。

C言語では、通常、文字列の終わりをマークするために使用されます。例文字列a="Arsenic"; 配列に格納されているすべての文字

a[0]=A
a[1]=r
a[2]=s
a[3]=e
a[4]=n
a[5]=i
a[6]=c

配列の最後には、文字列'a'の配列メモリ割り当てを停止するための''\0'が含まれています。

于 2021-07-13T00:54:17.393 に答える